[C#] Moq에서 메소드가 호출되지 않았는지 확인하는 방법은 무엇입니까?

Moq 에서 메소드가 호출되지 않았 는지 어떻게 확인 합니까?

AssertWasNotCalled와 같은 것이 있습니까?

업데이트 : 버전 3.0부터 새로운 구문을 사용할 수 있습니다.

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



답변

업데이트 : 버전 3부터는 위의 질문 또는 Dann의 답변에 대한 업데이트를 확인하십시오.

예상하지 않은 메소드를 호출하면 모의을 엄격하게하여 실패하지 않습니다.

new Mock<IMoq>(MockBehavior.Strict)

또는 모의를 풀고 싶다면 .Throws (Exception)

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


답변

Times.Neverenum 세트 가있는 테스트 후 확인을 실행하십시오 . 예 :

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


답변

도난 : 질문에 대한 John Foster의 답변, “Moq를 더 잘 이해하는 데 도움이 필요합니다”

테스트 할 수있는 것 중 하나는 65 세 이상이 메소드에 전달 될 때 pay 메소드가 호출되지 않는다는 것입니다

[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)는 Returns 문 뒤에 지정하는 것이 좋습니다 .

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

“throws”도 작동하지만 AtMost(0)보다 표현적인 IMHO입니다.


답변

.AtMostOnce ()를 사용하십시오.

실제 테스트 후 메소드를 다시 호출하십시오. 예외가 발생하면 호출됩니다.


답변