TDD数据访问层

4
在 TDD 中,我通过模拟数据访问功能来测试业务逻辑。 但实际上,应用程序还需要实现业务层以下的层级才能正常工作。 我是否应该使用 TDD 实现数据访问层? 根据我在网上看到的讨论,单元测试不应连接任何外部资源,例如数据库、Web 服务等。如果它们连接,则变成了集成测试。
请有经验的人指点一下。
非常感谢。
3个回答

2

您说得对,与外部联系使其成为集成测试,但这种联系对于测试也很重要。使用TDD,应该向您公开,接触面尽可能小。可以通过为每个记录使用包装器或类似方法来实现这一点。


1

如果您正在使用像Hibernate这样的东西,并且如果您在DAO中有任何类型的逻辑,您可以模拟对Session和Query等调用并进行单元测试而不会影响数据库。

如果您想要测试查询本身,您可以使用内存数据库和类似于DbUnit的工具。我将把它们视为集成测试,并单独运行它们,因为它们往往需要更长时间。

以下是一个典型的Java Spring / Hibernate DAO方法示例,其中包含一些您可能想要测试的逻辑:

public List<Entity> searchEntities(final String searchText, final int maxResults) {

   String sql = "select * from entity where field like :text";

   Query query = sessionFactory.getCurrentSession().createSQLQuery(sql);

   if (maxResults != 0) {
      query.setMaxResults(maxResults);
   }

   query.setString("searchText", "%"+searchText+"%");

   return query.list();

}

使用模拟框架,您可以模拟sessionFactory、session和query,并创建一个单元测试,其中期望只有在query.setMaxResults不等于0时才调用它,并且query.setString使用正确的字符串值进行调用。您还可以断言从query.list()返回的任何内容都是该方法返回的内容。
然而,这会使您的测试代码与此方法的实现耦合。此外,如果DAO方法中有很多逻辑,则应考虑重构并可能将此逻辑移动到服务层,在那里您可以单独对其进行单元测试,而无需进行任何数据库交互。

0

您可以使用Dev Magic Fake来伪造DAL,这样您就可以按照需要进行TDD开发,而无需编写任何伪造DAL的代码。

只需添加对DevMagicFake.dll的引用即可进行以下编码:

[HttpPost]
public ActionResult Create(VendorForm vendorForm)
{
    var repoistory = new FakeRepository<VendorForm>();
    repoistory.Save(vendorForm);
    return View("Page", repoistory.GetAll());
}

这将在内存中永久保存VendorForm,您可以随时检索它,还可以为此对象或模型中的任何其他对象生成数据,而无需编写任何代码来执行该操作,因此现在您可以完成TDD,因为您已经完成了DAL。有关Dev Magic Fake的更多信息,请参见CodePlex上的以下链接:

http://devmagicfake.codeplex.com

谢谢

M.Radwan


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接