2016-04-12 17 views
1

böyle bir test yazmaya çalışıyorum:rspec yöntemlerinin zincirleri nasıl test edilir. Gecikme bunlardan biridir

it 'logs events' do 
     expect(Event).to receive("delay.create!").with(hash_including(
                app_context: app_context, 
                event_type: Event::EventType::FOOD_SUBSCRIPTION_STARTED)) 
     subject 
     end 

kodu için şuna benzer:

Sadece bir noktada olduğunu test etmek istiyorum
Event.delay.create!(
     event_type: event_type, 
     description: 'Automatically populated', 
     date: Time.now.utc, 
     eventable: user, 
     app_context: app_context 
    ) 

, Olay olduğu .delay ve .create ile çağrıldı ve karma, 2 anahtar/değer çiftini oluşturdu. Bunu nasıl yaparım?

Event.delay yalnızca uzun bir sayı ve harf dizisi döndürür, bu yüzden bunu eklemek istediğimi düşünmüyorum?

+0

Bence "get_message_chain" yi arıyorsun. –

cevap

2

Birkaç yol var.

expect(Event.delay).to receive(:create).with(...).and_return(...) 

başka yolu ilk arama için bir saplama oluşturmak ve bunu kullanmaktır: (ilk çağrı büyük ve dağınık değilse çalışır)

bir yolu sadece ikinci çağrı örneğin saplama etmektir ikinci eg: benim durumumda sahip olduğunuz

delay_stub = double 
expect(delay_stub).to receive(:create).with(...).and_return(...) 
expect(Event).to receive(:delay).with(...).and_return(delay_stub) 

Not en iyi çalışması için verilen sırayla yukarıdaki yapmak.

+0

Beklediğinizden emin değildim (Event.delay).Ayrıca 'bekliyor' oradasın.Aşağıda yazman gereken: allow (Event.delay) (: create) and_return (Event) veya bir şey almak için. – Jwan622

+1

'expect' bir beklenti ayarlıyor tıpkı bekleyiş gibi (2 + 2) .qq (4) '- bu yöntemin çağrıldığından emin olmak için onu kullanırsınız (" sizin "olaylarınızda açıklandığı gibi)" orijinal gönderi). 'allow' diğer seçenek ise ve bunu başka bir şeyi test ederken kullandığınız için kullanıyorsunuz, ancak yaratma yöntemini çalıştırmak istemiyorsunuz, ancak bunun üzerine bir kâğıt kullanmak ve istediğiniz sonucu döndürdüğünden emin olmak istiyoruz. Bunu çoğu zaman diğer özellikler için içerik bloklarında kullanırsınız. –

0

Sonunda böyle bir testi (Ben de "sipariş" kullanmak için gerekli böylece sorun olduğunu

Event.delay.create! 

farklı argümanlarla testinde iki defa çağrıldığını oldu çıkıyor yazdı.

it 'logs events' do 
     allow(Event).to receive(:delay).and_return(Event) 
     expect(Event).to receive(:create!).with(hash_including(
      app_context: app_context, 
      event_type: Event::EventType::FOOD_SUBSCRIPTION_STARTED)).ordered 
     expect(Event).to receive(:create!).with(hash_including(
      app_context: app_context, 
      event_type: Event::EventType::FOOD_SUBSCRIPTION_COMPLETED)).ordered 
     subject 
     end 
İlgili konular