閑古鳥

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

Fluent Assertionsのソースを少し読んでみた

先日のエントリに書いた例ですが、

Add(1, 2).Should().Be(3);
// => Expected Add(1, 2) to be 3, but found 2.

これ、 Add(1, 2) の部分どうやって取ってるんだろう、と思ってソース読んでみました。StackTraceでそこまで取れるのかなぁと思ったんですが、テストコードの実装(*.cs)を直接見ていたみたいです。

CallerIdentifierクラスのDetermineCallerIdentityメソッドが目的のメソッドですが、ここでStackTraceクラスを使ってソースファイルのパス、行番号を取ってきてそれを元にソースファイルからコードを読み込んでいるようです。

確かに手元にソースがある状態でなら、あらゆる情報が取れますね…。

別解として、PowerAssert.Netだとアサーションにラムダを渡すことでLambdaExpressionから処理内容を取り出しているものがありました。

using PowerAssert;

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

[Test]
public void Test()
{
    PAssert.IsTrue(() => Add(1, 2) == 3);
}

実行結果:

System.Exception : IsTrue failed, expression was:

PowerAssertTests.ParserTest.Add(1, 2) == 3
                                . .     __
                                \ /     |
                                 |      False
                                 2

こちらはテストメソッドがIsTrueだけで覚える事が少なくてシンプルです(Throwsは割愛)。思想の差が面白いですね。