【问题标题】:How to avoid duplicating code for similar stubs?如何避免为类似的存根重复代码?
【发布时间】:2012-03-15 03:09:46
【问题描述】:

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

【问题讨论】:

    标签: c# unit-testing stub


    【解决方案1】:

    您可以通过使用一些隔离框架来避免手动编写存根。它允许动态创建存根。我个人更喜欢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 应该返回您的特定执行者列表。

    【讨论】:

      【解决方案2】:

      我倾向于通过在我的存根上添加额外的 setter 属性来解决这个问题,以便能够设置我在存根方法中返回的值,这些方法返回模拟数据以支持被测方法。

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

      【讨论】:

      • 是的,这也可以增加灵活性!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多