테스트에서 예외가 예상되지만 처리를 확인하려는 경우 어쨌든 호출됩니다.
-
06-07-2019 - |
문제
저는 POP3 클라이언트인 데모 애플리케이션을 단위 테스트하고 있습니다.POP3 클라이언트는 다음을 구현합니다. IDisposable
, 그래서 테스트하려고 합니다 using
주기.
(나는 nunit 2.5.2와 Moq 4.0을 사용하고 있습니다)
/// <summary>
/// Unsuccessful construct dispose cycle, no ILogger object given.
/// Expecting ArgumentNullException. Expecting TcpClient dispose to be called.
/// </summary>
[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void ConstructorDispose_LoggerNull_ArgumentNullException()
{
mockTcpClient.Setup(x => x.Dispose());
using (var popClient = new PopClient(null, mockTcpClient.Object))
{
}
mockTcpClient.VerifyAll();
}
보시다시피 verifyAll
그럼에도 불구하고 메서드는 호출되지 않으며 테스트는 성공합니다.그래서 ...
- 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
- 다른 방법이 있나요? 잡아보세요.
업데이트 지금은 다음과 같이 수정했습니다.
mockTcpClient.Setup(x => x.Dispose());
var correctExceptionThrown = false;
try
{
using (var popClient = new PopClient(null, mockTcpClient.Object))
{
}
}
catch (ArgumentNullException)
{
correctExceptionThrown = true;
}
finally
{
mockTcpClient.VerifyAll();
}
Assert.That(correctExceptionThrown);
하지만 dispose가 호출되지 않습니다., C# 사양인 것 같습니다.
해결책
mockTcpClient.Setup(x => x.Dispose());
try
{
using (var popClient = new PopClient(null, mockTcpClient.Object))
{
}
}
finally
{
mockTcpClient.VerifyAll();
}
다른 팁
이것은 귀하의 질문에 대한 답변은 아니지만(이미 해결되었으므로) 관련성이 있고 게시할 가치가 있습니다.
[ExpectedException]은 예외를 테스트하는 매우 까다로운 방법입니다.잘못된 행으로 인해 예상 유형의 예외가 발생하여 잘못된 전달이 발생할 수 있으므로 오류가 발생하기 쉽습니다.대신 Assert.Throws()를 확인하는 것이 좋습니다 :)
사용하기가 더 좋고(반환된 예외를 쿼리할 수 있음) 읽기 쉽고 무엇보다 안전합니다.
당신은 이미 dispose가 실제로 있다는 것을 발견했습니다 ~ 아니다 생성자가 실패하면 호출되어야합니다. 그러나 예상 예외가 발생한 후에 모의를 확인하고 싶은 다른 경우가 여전히있을 수 있습니다. 나는 다음과 같은 테스트 분해에서 그 일을한다.
[SetUp]
public void SetUp()
{
this.mockFactory = new MockFactory(MockBehavior.Loose);
}
[TearDown]
public void TearDown()
{
this.mockFactory.VerifyAll();
}
[Test]
[ExpectedException(typeof(NoBananasException))]
public void EatThrowsIfNoBananasAvailable
{
var bananaProvider = this.mockFactory.Create<IBananaProvider>();
bananaProvider.SetUp(bp => bp.IsBananaAvailable).Returns(false).Verifiable();
var monkey = new Monkey(bananaProvider.Object);
monkey.Eat();
}
생성자가 예외를 던지더라도 주입 된 mocktcpclient 인스턴스가 배치되는 것을 테스트하는 것 같습니다.이 경우 작동해야합니다.
mockTcpClient.Setup(x => x.Dispose());
try
{
var popClient= new PopClient(null, mockTcpClient.Object);
}
finally
{
mockTcpClient.VerifyAll();
}
편집 : 실제로 시도/마침내 예외를 포착하는 것보다 깨끗합니다. 인스턴스가 생성되지 않으므로 팝클리어를 폐기 할 필요가 없습니다.