Programing

NUnit 3.0 및 Assert.Throws

lottogame 2020. 11. 25. 07:29
반응형

NUnit 3.0 및 Assert.Throws


NUnit 3.0으로 일부 단위 테스트를 작성 중이며 v2.x와 달리 ExpectedException()라이브러리에서 제거되었습니다.

답변을 바탕으로 테스트에서 시스템이 예외를 던질 것으로 예상하는 위치를 구체적으로 파악하려는 논리를 확실히 볼 수 있습니다 (단순히 '테스트의 모든 위치'라고 말하는 대신).

그러나 나는 나의 Arrange, Act 및 Assert 단계에 대해 매우 명백한 경향이 있으며 이것이 도전을 만듭니다.

나는 다음과 같은 것을 사용했습니다.

[Test, ExpectedException(typeof(FormatException))]
public void Should_not_convert_from_prinergy_date_time_sample1()
{
    //Arrange
    string testDate = "20121123120122";

    //Act
    testDate.FromPrinergyDateTime();

    //Assert
    Assert.Fail("FromPrinergyDateTime should throw an exception parsing invalid input.");
}

이제 다음과 같이해야합니다.

[Test]
public void Should_not_convert_from_prinergy_date_time_sample2()
{
    //Arrange
    string testDate = "20121123120122";

    //Act/Assert
    Assert.Throws<FormatException>(() => testDate.FromPrinergyDateTime());
}

이것은 끔찍하지 않지만 제 생각에는 Act와 Assert를 혼란스럽게 만듭니다. (분명히이 간단한 테스트의 경우 따르기가 어렵지 않지만 더 큰 테스트에서는 더 어려울 수 있습니다.)

나는 동료가 내가 Assert.Throws완전히 제거 하고 다음과 같은 일을 할 것을 제안했습니다 .

[Test]
public void Should_not_convert_from_prinergy_date_time_sample3()
{
    //Arrange
    int exceptions = 0;
    string testDate = "20121123120122";

    //Act
    try
    {
        testDate.FromPrinergyDateTime();
    }
    catch (FormatException) { exceptions++;}

    //Assert
    Assert.AreEqual(1, exceptions);
}

여기서는 엄격한 AAA 형식을 고수하지만 훨씬 더 부풀어 오릅니다.

그래서 제 질문은 AAA 스타일의 테스터들에게 전달됩니다. 제가 여기서하려는 것과 같은 예외 검증 테스트를 어떻게 하시겠습니까?


이 경우에는 Act / Assert 단계를 결합하는 데 신경 쓰지 않아도 어디에서 왔는지 알 수 있습니다.

내가 생각할 수있는 유일한 방법은 실제 델리게이트 (여기서 to FromPrinergyDateTime)를 "act"단계로 변수에 저장 한 다음이를 주장하는 것입니다.

[Test]
public void Should_not_convert_from_prinergy_date_time_sample2()
{
    //Arrange
    string testDate = "20121123120122";

    //Act
    ActualValueDelegate<object> testDelegate = () => testDate.FromPrinergyDateTime();

    //Assert
    Assert.That(testDelegate, Throws.TypeOf<FormatException>());
}

나는 "행동"단계가 실제로 행동하는 것이 아니라 행동이 무엇인지 정의한다는 것을 알게됩니다. 그러나 테스트중인 작업을 명확하게 설명합니다.


C # 7에는 다른 옵션이 있습니다 (기존 답변과 매우 유사하지만).

[Test]
public void Should_not_convert_from_prinergy_date_time_sample2()
{
    void CheckFunction()
    {
        //Arrange
        string testDate = "20121123120122";

        //Act
        testDate.FromPrinergyDateTime();
    }

    //Assert
    Assert.Throws(typeof(Exception), CheckFunction);
}

주제에 대한 블로그 게시물


You can create a custom Attribute in NUnit 3. Here is the sample code how to create [ExpectedException] Attribute.(ExpectedExceptionExample Shows how to implement a custom attribute for NUnit) https://github.com/nunit/nunit-csharp-samples

참고URL : https://stackoverflow.com/questions/33897323/nunit-3-0-and-assert-throws

반응형