RSpec: Bir yöntemin çağrılıp çağrılmadığı nasıl test edilir?


112

RSpec testleri yazarken, bir testin yürütülmesi sırasında bir yöntemin çağrıldığından emin olmak için kendimi buna benzer birçok kod yazarken buluyorum (argüman uğruna, diyelim ki durumu gerçekten sorgulayamıyorum Yöntemin gerçekleştirdiği işlemin etkisini görmek kolay olmadığı için çağrıdan sonra nesnenin).

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
    called_bar = false
    subject.stub(:bar).with("an argument I want") { called_bar = true }
    subject.foo
    expect(called_bar).to be_true
  end
end

Bilmek istediğim şu: Bundan daha güzel bir sözdizimi var mı? Yukarıdaki kodu birkaç satıra indirecek bazı garip RSpec harikalarını kaçırıyor muyum? should_receivekulağa bunu yapması gerekiyormuş gibi geliyor ama daha fazla okumak tam olarak yaptığı şey bu değil gibi geliyor.



@Peter Alfvin OP söz dizimi istiyordu should_receive, bu yüzden bu sorunun yardımcı olacağını düşündüm.
kddeisz

Yanıtlar:


141
it "should call 'bar' with appropriate arguments" do
  expect(subject).to receive(:bar).with("an argument I want")
  subject.foo
end

1
Maalesef, bu "alınacak .. (: bar)" biçiminin bu örnekte "aranan_bar" değerini nasıl kontrol ettiğini anlamıyorum. Bunu bana açıklayabilir misin?
ecoding5

2
@ ecoding5 hayır. Olmaz ve kontrol edilmemelidir called_bar. Bu, yöntemin çağrıldığından emin olmak için sadece bir işaretti, ancak expect(...).to receive(...)sizinle zaten bunu ele alıyorsunuz. Daha net ve anlamsal
wacko

@wacko oooh, anladım, temizlediğin için teşekkürler. İlk seferinde yakalayamadım.
ecoding5


37

Aşağıdakiler çalışmalı

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
     subject.stub(:bar)
     subject.foo
     expect(subject).to have_received(:bar).with("Invalid number of arguments")
  end
end

Belgeler: https://github.com/rspec/rspec-mocks#expecting-arguments


Teşekkürler - "NoMethodError" has_received mesajı alıyordum? - bunun rspec versoins ile ilgili olabileceğini düşünüyorum. Benim için çalışan başka bir çözüm buldum (yukarıda doğru olarak işaretlenmiş olan)
Mikey Hogarth

@MikeyHogarth Bu cevap, RSpec'in bildiğim herhangi bir sürümünün parçası have_receivedolmayan ("casusluk" yaklaşımından sonra) öneriyordu has_received.
Peter Alfvin

2

RSpec ~> 3.1 sözdizimine ve rubocop-rspeckural için varsayılan seçeneğine tam olarak uymak için RSpec/MessageSpiesaşağıdakileri yapabilirsiniz spy:

Mesaj beklentileri, test edilen kodu çalıştırmadan önce başlangıçta bir örnek beklentisini ortaya koyuyor. Birçok geliştirici, testleri yapılandırmak için bir düzenle-harekete geçir-ileri sür (veya o zaman-verildiğinde) kalıbı kullanmayı tercih eder. Casuslar, has_received özelliğini kullanarak olaydan sonra bir mesajın alındığını beklemenize izin vererek bu kalıbı destekleyen alternatif bir çift test türüdür.

# arrange.
invitation = spy('invitation')

# act.
invitation.deliver("foo@example.com")

# assert.
expect(invitation).to have_received(:deliver).with("foo@example.com")

Rubocop-rspec kullanmıyorsanız veya varsayılan olmayan seçeneği kullanıyorsanız. Elbette, RSpec 3 varsayılanını beklediğiniz gibi kullanabilirsiniz.

dbl = double("Some Collaborator")
expect(dbl).to receive(:foo).with("foo@example.com")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.