2012-03-15 47 views
2

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

回答

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应该回到你的实干家的具体名单。

+0

Awsome,这有助于! – Mathieu 2012-03-15 03:43:18

1

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

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

+0

是的,这也可以增加灵活性! – Mathieu 2012-03-15 11:19:11