TDD 中に内部フィールドを設定するためにリフレクションを使用することは悪いことであると多くの場所で読みました。これはおそらく、テスト対象のクラスのインターフェイスをまだソートしていないことを意味するからです。ただし、完全にもっともらしいと思われるシナリオを提示したいと思います。リフレクション以外に、当面の問題に対する明確な解決策は考えられません。
対応するテストを含むクラスの例を次に示します。
public Class Movie
{
public string MovieName{get; private set}
public void AddExternalReview(IMovieReview review)
{
//Logic that needs Unit testing.
if ( review.MovieName.Equals(MovieName) )
{
//Do stuff..
}
}
}
単体テスト:
[Test]
public Class MovieTests
{
public void CanAddExternalReview()
{
MovieReviewStub movieReviewStub = new MovieReviewStub();
movieReviewStub.MovieName = "The Godfather";
Movie m = new Movie();
//Need to Set object m state(i.e set Property MovieName to "The Godfather")
//Only way to do that seems to be relection.
m.AddExternalReview(movieReviewStub);
//Assert on some condition.
}
}
クラスの「通常の」クライアントが設定できないプロパティを持つことはよくあることです。ただし、UnitTest クラスは、テストに必要な関連状態を設定できるように、そのようなプロパティ/フィールドにアクセスする必要がある場合があります。私が見る限り、反射が唯一の方法です。これは非常に一般的な要件であるに違いありませんが、Web 上のほとんどの記事や議論は、TDD でのリフレクションの使用に眉をひそめているようです。どんなアイデアや洞察も大歓迎です。