我在很多地方读到过,在 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 类可能需要访问此类属性/字段,以便它可以设置测试所需的相关状态。据我所知,反思是唯一的出路。这一定是一个相当普遍的要求,但网络上的大多数文章/讨论似乎都不赞成在 TDD 中使用反射。任何想法/见解都将受到欢迎。