테스트에서 예외가 예상되지만 처리를 확인하려는 경우 어쨌든 호출됩니다.

StackOverflow https://stackoverflow.com/questions/1617940

  •  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();
}

편집 : 실제로 시도/마침내 예외를 포착하는 것보다 깨끗합니다. 인스턴스가 생성되지 않으므로 팝클리어를 폐기 할 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top