我有一个测试文件,其中我存储了我测试类的依赖项(主要是存储库)。 存储库存根示例(从约200行缩短):
internal class doerRepository : IDoerRepository
{
public IQueryable<Doer> ActiveDoers
{
get
{
Account account = new Account();
//Property setting for account
Zone zone = new Zone();
//Property setting for zone
Doer doer = new Doer();
doer.Zone = doerZone;
doer.Account = doerAccount;
var list = new List<Doer>();
list.Add(doer);
return list.AsQueryable();
}
}
}
测试方法如下:
[Test]
public void IsValidDoer_DoerIsValid()
{
var doerValidation = new DoerValidation(new doerRepository());
//Assert things
}
问题是这个实体环境(它约占数据库的一半)是我的基线。我有大约25个测试来为这个测试文件。对于每个测试,我必须稍微更改存根(尝试使用无效区域,无效帐户等)。我最终复制粘贴200行来改变一个小东西(我必须重命名该类)。
是否可以重复使用存根代码并进行相关更改? 我尝试了这个,但我更改的值没有更新
internal class doerRepository2 : IDoerRepository
{
public IQueryable<Doer> ActiveDoers
{
get
{ List<Doer> list = new doerRepository().ActiveDoers.ToList();
list.First().Account = new Account();
return list.AsQueryable();
}
}
}
答案 0 :(得分:3)
您可以通过使用某种隔离框架来避免手动编写存根。它允许一个动态创建的存根。我个人更喜欢Moq。有了它,你的测试就可以用这种方式编写。
[Test]
public void IsValidDoer_DoerIsValid()
{
var mockRepository = new Mock<IDoerRepository>();
var activeDoers = CreateSpecificDoerList();
mockRepository.Setup(r => r.ActiveDoers).Returns(activeDoers);
var doerValidation = new DoerValidation(mockRepository.Object);
// Assert things
}
在这里,您要创建一个动态存根,并告诉它ActiveDoers
应该返回您的特定行动者列表。
答案 1 :(得分:1)
我倾向于通过在存根上添加额外的setter属性来解决这个问题,以便能够在返回模拟数据的存根方法中设置返回的值,以支持测试中的方法。
这样我通常只使用一个存根,因为我可以通过设置要返回的不同数据组合来重新使用它。