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.