如何避免重复类似存根的代码

本文关键字:存根 代码 何避免 | 更新日期: 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属性来解决这个问题,以便能够设置我在返回模拟数据的存根方法中返回的值,以支持测试中的方法。

这样,我通常只需要一个存根,因为我可以通过设置要返回的不同数据组合来重新使用它。