在 TDD 中,我通过模拟数据访问功能来测试业务逻辑。
但实际上,应用程序还需要实现业务层以下的层级才能正常工作。
我是否应该使用 TDD 实现数据访问层?
根据我在网上看到的讨论,单元测试不应连接任何外部资源,例如数据库、Web 服务等。如果它们连接,则变成了集成测试。
请有经验的人指点一下。
非常感谢。
请有经验的人指点一下。
非常感谢。
您说得对,与外部联系使其成为集成测试,但这种联系对于测试也很重要。使用TDD,应该向您公开,接触面尽可能小。可以通过为每个记录使用包装器或类似方法来实现这一点。
如果您正在使用像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();
}
您可以使用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