2011-09-07 111 views
4

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

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

请问有人可以对此有所了解。

非常感谢。

回答

2

你是对的,接触到外面使得集成测试,但接触是重要的测试也是如此。使用TDD时,它应该暴露给你,接触面尽可能小。这可以通过为每个记录使用包装或类似的方法来实现。

0

您可以使用开发魔术假来假的DAL,因此您可以根据您的需要,而无需编写任何代码,例如

假DAL

只需添加一个参考DevMagicFake.dll与TDD的工作,你可以在代码以下:

[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的更多信息,请参阅以下C odePlex:

http://devmagicfake.codeplex.com

感谢

M.Radwan

1

如果你使用类似Hibernate的东西,并且你的DAO中有任何类型的逻辑,你可以模拟出对例如会话和查询和单元测试的调用,而不用敲击数据库。

如果你想测试自己的查询,你可以使用内存数据库和类似DbUnit的东西。我会把这些数据统计为集成测试,并分别运行,因为它们往往需要更长的时间。

下面是一个典型的Java春/ 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方法中有很多逻辑,那么你应该考虑重构,并且可能将这个逻辑转移到一个服务层,在那里你可以单独测试它与任何数据库交互。