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


466

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

AssertWasNotCalled와 같은 것이 있습니까?

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

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

답변:


155

업데이트 : 버전 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."));

9
... 또는 Callback ()을 사용하여 어설 션 할 수있는 플래그를 설정합니다.
— alex

2
또한 옵션 # 2를 사용하면 일반적인 Teardown 방법에서 VerifyAll을 가질 수 없습니다. 기대가 충족되지 않았다는 말은 실패합니다. 시험이 이상적으로 통과해야 할 때.
— Gishu

51
이것은 메서드 내에서 잡힐 수 있고 여전히 작동 할 수 있기 때문에 실제로 "호출되지 않음"이 아닙니다.
— Dan

4
지금은 사용되지 않습니다 기대
— 토마스 시코

5
이것이 2009 년에 가장 좋은 방법이었을 수도 있지만 지금은 그렇지 않습니다. 죄송합니다
— Fabio Milheiro

537

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

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

4
여기서 중요한 것은 Verify (action, Never) 호출이 모의 호출 후 라는 것입니다. 나는 그것이 나중에 작동 하지 않는 VerifyAll ()을 호출하기위한 확인을 설정한다고 생각했다.
— piers7

간단하고 효과적입니다. 감사.
— Ian Grainger

45

도난 : 질문에 대한 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());
}

10

최근 버전의 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입니다.


-5

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

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


1
조롱 프레임 워크에 의해 예외가 발생했다고 주장하기에는 조금 모호하지 않습니까?
— alex

왜? 예외 유형을 확인하십시오. 그것이 내 Moq를 던졌다면 안전합니다.
— Aaron Digulla

8
Times로 Verify를 사용하는 것이 더 좋은 선택은 아닙니다 ... Alex 가이 솔루션이 작동하지만 확실히 모호하다는 것에 동의합니다.
— 경고음 경고음
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.