先日のエントリに書いた例ですが、
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は割愛)。思想の差が面白いですね。