模拟领域模型&不重复地构建测试

时间:2014-08-01 09:59:32

标签: c# unit-testing testing mocking

寻找有关测试的一些说明。我的服务层中有以下方法:

readonly IDomainModelRepository domainModelRepository;

public DomainModelDetailsDto Edit(int DomainModelID, IPrincipal User)
{
    DomainModel myDomainModel = domainModelRepository.Find(DomainModelID);
    if ((myDomainModel == null) || (!myDomainModel.UserCanEdit(User)))
        throw new UnauthorisedException();

    // Other stuff here...
}

现在我正在构建一套测试但是遇到了一些障碍。

  1. 无法模拟对myDomainModel.UserCanEdit(User)的调用,因为DomainModel未实现任何接口。它变得更加复杂,因为UserCanEdit中包含的逻辑实际上会检查其图中其他域模型上的字段。那么如何轻松地将其设置为返回设定值以允许我测试服务?
  2. 我正在测试如果repo找不到DomainModel项,方法会正确响应。然后我测试它是否正确响应,如果用户无法编辑(好吧,我将在我解决上面的第1点!)。但在那之后,我为“其他东西在这里”编写的每个测试都要求我正确设置测试以通过前两个检查。这似乎很麻烦,并使每个测试重复相同的代码。还有更好的方法吗?
  3. 也许问题是我的代码本身需要重构才能更方便地进行测试。如果是这样,所有建议都表示赞赏!

2 个答案:

答案 0 :(得分:0)

如果您想测试我认为您需要在myDomainModel上使用界面,否则您无法模拟它。

我知道这是一个非常有争议的观点,但是越来越多的人认为Repository模式是一种反模式,因为它产生的问题多于它解决的问题。

我个人使用Entity Framework并更改TT文件以生成Context和界面,而不是在我的所有应用程序中我只使用该界面。

测试我只是模拟界面,我能够测试一切。我所做的一项更改是使用DbSet<T>更改所有IDbSet<T>。最后,我创建了一个Test Helper,其函数接收ObservableCollection并返回IDbSet,并且我能够验证所有内容。

答案 1 :(得分:0)

您可以通过创建该方法UserCanEdit并使用派生的测试类来覆盖它来存储virtual。然后,您的模拟存储库可以返回此测试类集的实例,以根据您要测试的内容返回true或false。