2012-04-28 101 views
2

假设我们有一个典型的资源库到单元测试Repository.Update方法正道

public class Repository:IRepository<Entity> 
    { 
      public Entity GetById(int id) 
      { 
       //blah 
      } 

      public IEnumerable<Entity> All() 
      { 
       //blah 
      } 

      public void Insert(Entity entity) 
      { 

      } 

      public void Update(Entity entity) 
      { 
       //blah 
      } 

      public void Delete(Entity entity) 
      { 
       //blah 
      } 
    } 

使用MSTest的,我想测试存储库的接入能力和更新实体。只要它是具体的Repository,我正在测试一个真正的DB。

所以,当我测试插入方法 - 战略是明确的

  1. 创建新的实体
  2. 保存
  3. 通过ID获取实体
  4. 断言实体由库返回

但是,当我想到更新方法测试它都有点棘手。 的主要问题是

  • 如何保证数据库已存储的对象,我可以取回,并尝试 更新?
  • 如何针对空数据库测试更新?

看起来像解决方法将需要一些不必要的代码和测试会得到臃肿。 有没有优雅的解决方案?

+0

你打算'单元测试'是不是真的单元测试,因为你没有测试一个孤立的单位,而是多个单位的整合。重新思考你想做什么。如果你想单元测试你的代码,那么就单独测试更新方法。您可以通过测试更新方法是否遵循预期的路径并使其实例保持其预期状态来做到这一点。 – Polity 2012-04-28 09:51:19

+0

单元测试我的Repository类处理RDBMS的正确方法是什么?不知何故,我需要检查它做它应该做的。 – 2012-04-28 10:00:47

+0

用这种方法试试看:你想单元测试你的更新方法。如果数据库发生故障(例如磁盘空间已满),那并不意味着您的更新方法错误或中断。您无需测试您的项目是否已在数据库中更新。你需要检查你的更新方法是否做到了你所期望的。 (例如对数据库层进行正确调用) – Polity 2012-04-28 10:02:52

回答

3

使用ClassInitializeTestInitialize,连同ClassCleanupTestCleanup预填充知名实体的数据库。然后对他们运行Update()测试。

不确定如何解释“不必要的代码”...它看起来像你将不得不做一些事情来填充你的数据库,以便测试Update()方法;至少使用上面列出的属性可以实现初始化和清理数据库所需的逻辑,而不会污染实际的测试方法。

+0

对于不同的测试方法是否可以有不同的TestInitialize方法? – 2012-04-28 10:06:20

+0

否;他们是特定于类的。你可以将测试分成不同的类。 – 2012-04-28 10:22:39