我应该测试通用存储库中的每个通用类型吗?

时间:2017-06-22 12:26:03

标签: c# unit-testing generics repository-pattern

我目前正在为我在洋葱架构中实现的Generic Repository进行测试。我的数据访问是使用Entity Framework Code First进行的。

由于我有一个通用的存储库,我几乎可以使用任何实体(POCO)作为存储库的通用类型。为了说明这一点,repo看起来像这样(没有接口或实现的基本仓库):

public class Repository<T> where T : class
{
   //Code here
}

现在,我想测试它,所以我的问题就出现了:我必须在测试中使用每个实体吗?假设我有表格:文档,类别,个人资料,群组等等......

我是否必须以这种方式测试所有这些POCO:

Repository<Document> repoDoc = new Repository<Document>();
Repository<Category> repoCat = new Repository<Category>();
//And so on for each and every table, and then apply tests to each

请注意,我有几百个表,所以这样做的想法让我很难过:D

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

泛型的概念是抽象出独立于确切数据类型的操作的核心代码(或扩展具体的数据)。测试每个可能的实现与完全没有任何泛型并测试所有实现相同

那么,在这里测试什么?与往常一样:关键代码。以一些代表性的例子来说明你的代码将处理什么,并为这些案例编写一些测试

为了解释这一点:假设你有这样的东西:

function add(int number1, number 2) {
    return number1 + number2;
}

你会测试什么?你会测试每个可能的整数对吗?这没有任何意义!再次,选择一些具有代表性的案例并进行测试

在测试时,您不仅应该选择代表性案例,还应该选择 edge 案例。这是您知道某些条件将被测试的情况。例如:

function something(int number) {
    for(int i = 0; i < number; i++) {
        ...
    }
}

在那种情况下你会测试什么?好吧,一些有代表性的值会是-5,10 ......但是一个importante值是 0 因为它涉及到每一个并且在这种情况下事情可能有点奇怪

谈论数据库可能具有代表性的案例:

  • 单人表
  • 关系表(外键)
  • ...

边缘情况怎么样?

  • 删除
  • 使用外键删除
  • 使用引用不存在的对象的外键进行更新
  • ...

我想到的一些例子