如何避免重复类似存根的代码
本文关键字:存根 代码 何避免 | 更新日期: 2023-09-27 18:28:03
我有一个测试文件,我在其中存根测试类的依赖项(主要是存储库)。存储库存根示例(从大约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();
}
}
}
您可以通过使用一些隔离框架来避免手工编写存根。它允许动态创建存根。我个人更喜欢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
应该返回您的特定执行者列表。
我倾向于通过在存根上添加额外的setter属性来解决这个问题,以便能够设置我在返回模拟数据的存根方法中返回的值,以支持测试中的方法。
这样,我通常只需要一个存根,因为我可以通过设置要返回的不同数据组合来重新使用它。