在TDD中,我一直在通过模拟数据访问功能来测试业务逻辑。 但实际上我还需要实现业务层下面的层才能使应用程序正常工作。
我应该使用TDD实现数据访问层吗?
基于我在网上看到的讨论,单元测试不应该连接到任何外部资源,如数据库,Web服务等。如果它们连接,那么它们就会成为集成测试。
请有人对此有所了解。
非常感谢。
答案 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