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

时间:2012-03-15 03:09:47

标签: c# unit-testing stub

我有一个测试文件,其中我存储了我测试类的依赖项(主要是存储库)。 存储库存根示例(从约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();
        }
    }
}

2 个答案:

答案 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属性来解决这个问题,以便能够在返回模拟数据的存根方法中设置返回的值,以支持测试中的方法。

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