閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

FluentAssersions

Fluent Assertions

一時流行った(?)流れるメソッド的なアレでテストが書けるライブラリ。もしくはSpec的なやつ。最近のNUnitもこれに近い記法になるけど、冗長じゃないかな? と思っていたけどテストコードより、その結果が重要という感じみたい。失敗した時、なぜ失敗したのかがすぐわかるようでなければ不便でしょ、と。確かに。

using FluentAssertions;
using Xunit;

static int Add(int x, int y) => 2;

[Fact]
public void Test1()
{
    Assert.Equal(3, Add(1, 2));
}

[Fact]
public void Test2()
{
    Add(1, 2).Should().Be(3);
}

あからさまに雑な例ですが、このようなテストを実行したときの結果が以下のようになります。

メッセージ
xUnit.net Assert.Equal() Failure
Expected: 3
Actual: 2
Fluent Assersions Expected Add(1, 2) to be 3, but found 2.

なるほどリッチ。実行速度は50倍くらい遅くなりますが、許容範囲内ですかね?

AssersionScope

AssersionScopeというクラスがあり、普通アサーションに失敗するとそこでテストは終わりますが、このスコープ内にあるうちは続けてテストを行うみたいな機能もあるようです。1つのテストにアサーションを何個も書くなという話ではありますが、これはこれであると嬉しいシーンもあるかも。

using FluentAssertions;
using FluentAssertions.Execution;
using Xunit;

[Fact]
public void Test3()
{
    using var scope = new AssertionScope();

    3.Should().BeLessThan(2);                    // ↑scopeがなければここで終了するが
    (new int[] { 1, 2, 3 }).Should().Contain(0); // ←scopeがあるのでこれも実行される
}

// 実行結果
//   メッセージ: 
//    Expected value to be less than 2, but found 3.
//    Expected collection {1, 2, 3} to contain 0.