TDD数据访问层

时间:2011-09-07 09:24:51

标签: tdd data-access-layer

在TDD中,我一直在通过模拟数据访问功能来测试业务逻辑。 但实际上我还需要实现业务层下面的层才能使应用程序正常工作。

我应该使用TDD实现数据访问层吗?
基于我在网上看到的讨论,单元测试不应该连接到任何外部资源,如数据库,Web服务等。如果它们连接,那么它们就会成为集成测试。

请有人对此有所了解。

非常感谢。

3 个答案:

答案 0 :(得分:2)

你是对的,与外界联系使其进行集成测试,但这种联系对于测试也很重要。使用TDD时,接触面应尽可能小。这可以通过为每个记录或类似方法使用包装器来实现。

答案 1 :(得分: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,会话和查询,并创建一个单元测试,期望query.setMaxResults仅在不等于0并且query.setString为使用正确的字符串值调用。你也可以断言从query.list()返回的是该方法返回的东西。

然而,这使您测试代码与您的此方法的实现相结合。此外,如果您的DAO方法中有很多逻辑,那么您应该考虑重构,并且可能将此逻辑移动到服务层,您可以在其中单独测试它与任何数据库交互。

答案 2 :(得分:0)

您可以使用Dev Magic Fake伪造DAL,这样您就可以根据需要使用TDD,而无需为Fake 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

相关问题