Sparky의 도구 설명: 유창한 어설션

나는 일반 개발자보다 단위 테스트를 작성하는 것을 더 좋아합니다(많이 말하지는 않지만 테스트는 많은 개발자가... de-test 🥁).

테스트를 더 쉽고 재미있게 작성할 수 있게 해주는 도구(사실 )에 진심으로 감사하며 Fluent Assertions은 제가 가장 좋아하는 것 중 하나입니다.



Microsoft.VisualStudio.TestTools.UnitTesting Assert, StringAssert 및 CollectionAssert 클래스는... 알겠습니다. (NUnit을 사용한 지 오래되었고 xUnit을 사용해 본 적이 없어서 해당 프레임워크에 내장된 assert에 대해 잘 모릅니다.)

Fluent Assertion은 문장과 유사한 구문으로 TDD 또는 BDD 스타일 단위 테스트의 예상 결과를 지정할 수 있는 일련의 .NET 확장 메서드입니다. 예를 들어 "MSTest"구문은 다음과 같습니다.

Assert.AreEqual(31, daysInJune);


...다음과 같이 유창하게 표현할 수 있습니다.

using FluentAssertions;
. . .
daysInJune.Should().Be(31);


"FluentAssertions"네임스페이스를 "사용"하면 다음에 대한 수많은 유용한 "Should()"확장 메서드를 사용할 수 있습니다.

문자열:


  • 비(예상)
  • BeNull()
  • BeEmpty()
  • StartWith(예상)
  • EndWith(예상됨)
  • HaveLength(예상)
  • 포함(예상)
  • ...

  • 번호:


  • 비(예상)
  • BeGreatorOrEqualTo(예상됨)
  • BeLessOrEqualTo(예상됨)
  • BeInRange(최소, 최대)
  • BePositive()
  • ...

  • 날짜 시간:


  • Be(1.March(2022).At(22, 15))
  • 비온오어애프터(1.3월(2010))
  • 해브데이(1)
  • 해브월(3)
  • 해브이어(2010)
  • 해브아워(22)
  • BeLessThan(10.Minutes()).Before(otherDatetime)
  • ...

  • 컬렉션:


  • HaveCount(예상)
  • HaveSameCount(otherCollection)
  • 포함(예상)
  • NotContain(예상됨)
  • OnlyContain(x => x.predicate)
  • ...

  • 이것은 단지 몇 가지 예일 뿐입니다. 이들과 다른 많은 유형에 대한 수십 가지 방법이 더 있습니다.

    그리고... 어설션은 연결 가능합니다!




    string stateName = "OHIO";
    stateName.Should().StartWith("O").And.EndWith("O").And.Contain("HI");
    


    예외



    MS 테스트[ExpectedException(type)] 속성이 마음에 들지 않습니다. 다른 단점 중 하나는 예외 메시지를 테스트할 수 없다는 것입니다.

    Fluent Assertion을 사용하면 예외 테스트는 다음과 같습니다.

    subject.Invoking(x => x.Foo("Hello"))
        .Should().Throw<InvalidOperationException>()
        .WithMessage("Hello is not allowed at this moment");
    


    ...또는 "arrange/act/assert"구문 사용:

    Action action = () => x.Foo("Hello");
    
    action
        .Should().Throw<InvalidOperationException>()
        .WithMessage("Hello is not allowed at this moment");
    


    확장성



    Fluent Assertion은 자신만의 "Should"확장 메서드를 작성할 수 있도록 잘 설정되어 있습니다.

    내 자신의 many NuGet packages을 포함하여 추가 확장 방법을 포함하는 SparkyTestHelpers.Moq.Fluent이 있습니다.

    하지만 더 있습니다!



    Fluent Assertions는 어설션 작성을 위한 더 나은 구문을 제공할 뿐만 아니라 어설션이 실패할 때 훨씬 더 나은 메시지를 제공합니다. 예를 들면 다음과 같습니다.

    Assert.AreEqual 사용:

    string correctNameSpelling = "Bryan";
    Assert.AreEqual("Brian", correctNameSpelling);
    


    ...실패 메시지는 다음과 같습니다.

    Assert.AreEqual failed. Expected:<Brian>. Actual:<Bryan>.
    


    유창한 어설션 사용:

    string correctNameSpelling = "Bryan";
    correctNameSpelling.Should().Be("Brian");
    


    ..실패 메시지는 다음과 같습니다.

    Expected correctNameSpelling to be "Brian", but "Bryan" differs near "yan" (index 2).
    


    "differs near"와 인덱스는 이렇게 짧은 문자열에는 약간 과잉이지만 긴 문자열에는 매우 편리합니다!

    (그런데, 이것은 사소한 예가 아닙니다. correctNameSpelling은 "Brian"이어야 하며 부모님이 이름을 "Bryan"으로 지정했다면 부모님에게 전화를 걸어 불평해야 합니다.😏)


    저는 Fluent Assertions를 많이 좋아합니다. .NET 단위 테스트를 작성하고 있다면 .Should()를 사용해 보십시오!

    좋은 웹페이지 즐겨찾기