ฉันจะตรวจสอบวิธีการที่ไม่ได้เรียกว่าในMoq ได้อย่างไร?
มันมีบางอย่างเช่น AssertWasNotCalled หรือไม่?
อัปเดต: เริ่มจากเวอร์ชัน 3.0 คุณสามารถใช้ไวยากรณ์ใหม่ได้:
mock.Verify(foo => foo.Execute("ping"), Times.Never());
ฉันจะตรวจสอบวิธีการที่ไม่ได้เรียกว่าในMoq ได้อย่างไร?
มันมีบางอย่างเช่น AssertWasNotCalled หรือไม่?
อัปเดต: เริ่มจากเวอร์ชัน 3.0 คุณสามารถใช้ไวยากรณ์ใหม่ได้:
mock.Verify(foo => foo.Execute("ping"), Times.Never());
คำตอบ:
อัปเดต : ตั้งแต่เวอร์ชัน 3 ให้ตรวจสอบการอัปเดตของคำถามด้านบนหรือคำตอบของ Dann ด้านล่าง
ทำแบบจำลองให้เข้มงวดดังนั้นมันจะล้มเหลวถ้าคุณเรียกใช้วิธีการที่คุณไม่คาดคิด
new Mock<IMoq>(MockBehavior.Strict)
หรือถ้าคุณต้องการจำลองของคุณจะหลวมใช้. Throws (ข้อยกเว้น)
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
เรียกใช้การตรวจสอบหลังจากการทดสอบที่มีการTimes.Never
กำหนด Enum เช่น
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
ขโมยมาจาก: John Foster ตอบคำถามนี้ว่า "ต้องการความช่วยเหลือในการทำความเข้าใจ Moq ให้ดีขึ้น"
สิ่งหนึ่งที่คุณอาจต้องการทดสอบคือวิธีการจ่ายเงินจะไม่ถูกเรียกเมื่อบุคคลที่มีอายุมากกว่า 65 ปีถูกส่งเข้าสู่วิธีการนั้น
[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()); }
สิ่งนี้ไม่ทำงานใน Moq รุ่นล่าสุด (ตั้งแต่อย่างน้อย 3.1) ควรระบุใน
Verify
วิธีการตามที่ระบุไว้ในคำตอบ
จริงๆแล้วมันเป็นการดีกว่าที่จะระบุ.AtMost(0)
หลังคำสั่ง Return
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
แม้ว่า "พ่น" ก็ใช้งานได้ แต่AtMost(0)
IMHO ก็แสดงออกได้มากกว่า
ใช้. AtMostOnce ();
หลังจากการทดสอบจริงเรียกวิธีการอีกครั้ง หากมีข้อผิดพลาดจะถูกเรียก