Bu yöntemin Adedi çağrılmadığını nasıl doğrularım?


466

Bu yöntemin Adedi çağrılmadığını nasıl doğrularım ?

AssertWasNotCalled gibi bir şey var mı?

GÜNCELLEME: Sürüm 3.0'dan başlayarak yeni bir sözdizimi kullanılabilir:

mock.Verify(foo => foo.Execute("ping"), Times.Never());

Yanıtlar:


155

GÜNCELLEME : Sürüm 3'ten bu yana yukarıdaki soruya ilişkin güncellemeyi veya Dann'ın aşağıdaki cevabını kontrol edin.

Ya da, alayınızı sıkı yapın, böylece beklemediğiniz bir yöntemi çağırırsanız başarısız olur

new Mock<IMoq>(MockBehavior.Strict)

Ya da, alayınızın gevşek olmasını istiyorsanız, .Throws (Exception)

var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));

9
... veya ileri sürülebilecek bazı bayraklar ayarlamak için Geri Arama () işlevini kullanın.
alex

2
Ayrıca # 2 seçeneğiyle, genel bir Teardown yönteminde VerifyAll'a sahip olamazsınız - beklentinin karşılanmadığını söyleyemez; testin ideal olarak geçmesi gerektiğinde.
Gishu

51
Bu gerçekten bir "doğrulama çağrılmadı" değil çünkü yöntem içinde yakalanmış olabilir ve hala işe yarayacak - yanlış bir pozitif sağlayarak!
Dan

4
Beklentiler artık kullanımdan kaldırıldı
Tomasz Sikora

5
Bu, 2009'da mümkün olan en iyi yol olabilirdi, ama kesinlikle şimdi değil. üzgünüm
Fabio Milheiro

537

Bir Times.Neverenum seti olan testten sonra bir doğrulama çalıştırın . Örneğin

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());

4
Burada kritik olan, Doğrula (eylem, Asla) çağrısının sahte çağrının ardından olmasıdır . Bunun üstü) VerifyAll (çağırmak için doğrulama oluşturmayı düşündüm (ki does not iş)
piers7

Basit ve etkili. Teşekkürler.
Ian Grainger

45

Çalınan: John Foster'ın "Adedi daha iyi anlamak için yardıma ihtiyacım var" sorusuna cevap

Test etmek isteyebileceğiniz şeylerden biri, 65 yaşın üzerindeki bir kişi yönteme geçtiğinde ödeme yönteminin çağrılmamasıdır.

[Test]
public void Someone_over_65_does_not_pay_a_pension_contribution() {

    var mockPensionService = new Mock<IPensionService>();

    var person = new Person("test", 66);

    var calc = new PensionCalculator(mockPensionService.Object);

    calc.PayPensionContribution(person);

    mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never());
}

10

Bu, Moq'un son sürümlerinde çalışmaz (en az 3.1 olduğundan), Verifycevapta belirtildiği gibi yöntemde belirtilmelidir.

Aslında, .AtMost(0)İade ifadesinden sonra belirtmek daha iyidir .

var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

Her ne kadar "atar" da çalışır, AtMost(0)daha etkileyici IMHO.


-5

.AtMostOnce () kullanın;

Gerçek testten sonra, yöntemi tekrar arayın. Bir istisna atarsa ​​çağrıldı.


1
Alaycı çerçeve tarafından istisnanın atıldığını iddia etmek biraz belirsiz değil mi?
alex

Neden? İstisna türünü kontrol etmeniz yeterlidir. Benim Adımı atarsa, güvendesin.
Aaron Digulla

8
Asla daha iyi bir seçim değildir ... Alex'e bu çözümün işe yaradığını, ancak kesinlikle belirsiz olduğunu kabul ediyorum.
Beep beep
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.