그 방법이 Moq에서 호출되지 않았는지 어떻게 확인합니까?
Moq에서 메서드가 호출되지 않았는지 확인하려면 어떻게 해야 합니까?
Assert Was Not Called와 같은 것이 있습니까?
업데이트: 버전 3.0부터는 새로운 구문을 사용할 수 있습니다.
mock.Verify(foo => foo.Execute("ping"), Times.Never());
테스트 후 Verify를 실행합니다.Times.Never()
선택.
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(), Times.Never());
업데이트: 버전 3부터 위 질문에 대한 업데이트 또는 아래 Dann의 답변을 확인합니다.
또는, 당신이 예상하지 못한 방법을 호출하면 실패할 수 있도록 당신의 모의를 엄격하게 하라.
new Mock<IMoq>(MockBehavior.Strict)
또는 모의실험을 느슨하게 하려면 를 사용합니다.던지기( 예외 )
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
도난당한 사람: "Moq를 더 잘 이해하려면 도움이 필요합니다"라는 질문에 대한 John Foster의 대답
테스트하고 싶은 것 중 하나는 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)
Returns 문 뒤에 있습니다.
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
비록 "던지기"도 효과가 있지만,AtMost(0)
더 표현력이 풍부한 IMHO입니다.
사용.VerifyNoOtherCalls
(Moq 4.8 이상 필요)
이 대답은 간접적인 접근입니다.특정 메서드가 호출되지 않았는지 확인하는 대신 일반적으로 예기치 않은 호출이 발생하지 않았는지 확인합니다.
모의 실험의 철저한 테스트가 다음 두 가지를 수행한다고 가정합니다.
- 모든 예상 통화가 이루어졌는지 확인
- 예상치 못한 통화가 발생하지 않았는지 확인합니다.
이미 1단계를 수행하고 있는 경우 2단계를 추가하는 것은 사소한 일입니다.
// Step 1 (if relevant - see note below)
mock.Verify(..., Times.Exactly(2));
mock.Verify(..., Times.Once());
// ...
// Step 2
mock.VerifyNoOtherCalls();
메모들
- 1단계를 생략하면 2단계에서는 모의실험에 대한 호출이 전혀 발생하지 않았음을 확인할 수 있습니다.
- 이것은 엄격한 모의실험이 필요하지 않습니다.
- 출처: Moq Quickstart
저는 이것이 아주 오래된 질문이라는 것을 알고 있지만, 제 사이드바에 방금 나타났기 때문에 제 해결책을 추가하고 싶습니다.
대부분의 장치 테스트는 설정의 일부로 여러 기능을 모의하는 것으로 보이지만 테스트 중에는 사용되지 않습니다.
확실히 엄격한 조롱(명시적으로 설정되지 않은 모든 것은 예외를 발생시킬 것임을 의미)을 사용하도록 설정한 다음 호출될 것으로 예상되지 않는 기능을 설정하지 않는 것이 좋습니다.또는 한 테스트에서 호출될 것으로 예상되는 기능만 설정하면 다른 모든 기능은 예외가 됩니다.
var thingBeingTested = new Mock<IThink>(MockBehaviour.Strict);
thingBeingTested.ThisWillThrowAnExceptionBecauseItHasNotBeenMocked();
이 메서드가 있는데 호출되지 않는지 테스트하려고 합니다.
//Setup
var databaseSessionMock = new Mock<IDatabaseSession>();
databaseSessionMock.Setup(m => m.Commit()).Returns(true).Verifiable();
RepositoryFactory.Configure<IDatabaseSession>(databaseSessionMock.Object);
당신은 이렇게 테스트할 수 있습니다.
databaseSessionMock.Verify(m => m.Commit(It.IsAny()), Times.Never(), "Database Session mock object was not used");
.AtMostOnce()를 사용합니다;
실제 테스트가 끝나면 메소드를 다시 호출합니다.예외가 발생하면 호출되었습니다.
언급URL : https://stackoverflow.com/questions/537308/how-to-verify-that-method-was-not-called-in-moq
'programing' 카테고리의 다른 글
SqlConnectionStringBuilder를 사용하여 연결 문자열에서 데이터베이스 이름을 가져오는 방법 (0) | 2023.05.24 |
---|---|
큰따옴표로 묶인 문자열에서 개체의 속성을 사용하려면 어떻게 해야 합니까? (0) | 2023.05.24 |
UI Navigation Controller의 뒤로 막대 단추를 누를 때 작업 실행 (0) | 2023.05.20 |
코드가 최적화되었거나 네이티브 프레임이 호출 스택의 맨 위에 있으므로 식을 계산할 수 없습니다. (0) | 2023.05.20 |
VBA 매크로에서 기호 #(해시) 사용 (0) | 2023.05.20 |