07 Mar 2016

Merhabalar bugünün programı şöyle:

  • Balıklama Dalış
  • Tanıtımlar
  • İlk kaset
  • Adeta Gerçek Bir Kesit
  • İstiklal Marşı ve Kapanış
***

Eğer 3. parti web servisleri ile çalışıyor/veya çalışmak zorunda kalıyorsanız internetinizin olmadığı, rate limite takılabileceğiniz, cevap süresinin uzun olduğu veya 3.parti servisin kapattık hacı bugün beş saat diyerek cevap alamayabileceğiniz anlar olabilir. Test yazarken bu tür bağımlılıklardan kurtulmak için stubbing with vcr.

Stub nedir?

Kısaca sahteleme diyebiliriz. Test yazarken bağımlılıkları gidermek için servis ile aynı sonucu döndüren bir methodla değiştirme işlemi

Vcr nedir?

HTTP etkileşimlerini kaydedip/kasete sarıp testleriniz esnasında hızlıca, aynı response ile defalarca kullanmanıza yarayan bir gem.

Kurulum

Vcr gem’ini ve kullanacağınız http kütüphanesine ait gem’i Gemfile ekleyin ve kurun. webmock, fakeweb, faraday, httparty gibi birçok aracı destekliyormuş vcr.

# Gemfile
group :test do
  gem 'webmock'
  gem 'vcr'
end

Bana oradan bir ayar çek

Bu arada benim verdiğim örnekler rspec için.

# spec/rails_helper.rb
VCR.configure do |c|
  # Kasetlerin bulunacağı yer
  c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
  # Kullanılacak http request servisi
  c.hook_into :webmock # or :fakeweb ..
end

İlk Vcr Kaseti

Eğer blog_kaseti daha önce oluşturulmamışsa ilk kez çalıştığında oluşacak eğer varsa kasetten okuyacak.

require 'rails_helper'

describe 'Blog', type: :request do
  it "return 200" do
    VCR.use_cassette('blog_kaseti') do
      response = Net::HTTP.get_response(URI('http://askingedik.net'))
      expect(response.code).to eq '200'
    end
  end
end

Bu test sonucunda spec/fixtures/vcr_cassettes/ dizini altında blog_kaseti.yml dosyası oluştu. İçinde yapılan istekle ilgili bilgiler var. Aynı sorguyu farklı cevaplar alacak şekilde farklı isimlerle kaydedebilirsiniz.

Tavsiyeler

Kasetin bozuk veya eski bir istek olmadığından emin olun. Mesela ben bir kez servisten gelen hatalı mesajı kaydedip ulan bozuk geliyor niye geliyor tribine girmiştim. Dalgınlık işte :/

Biz Protel’de rspec ile birlikte vcr gem’ini neredeyse her projede kullanıyoruz ve çok memnunuz sizinde bir göz atmanızı tavsiye ederim.

Kaynaklar

Aşkın Gedik
Software Engineer

Ben Aşkın,

Benimle ilgili daha fazla bilgiyi hakkımda sayfasına göz atarak veya Twitter, Facebook ve Github üzerinden takip ederek öğrenebilirsiniz.