在TDD中,我一直在通过嘲笑数据访问功能来测试业务逻辑。 ,但实际上我需要业务层下面的层也要实现应用程序工作。TDD数据访问层
我应该使用TDD来实现数据访问层吗?
根据我在网上看到的讨论,单元测试不应该连接到任何外部资源,如数据库,Web服务等。如果它们连接,那么它们将成为集成测试。
请问有人可以对此有所了解。
非常感谢。
在TDD中,我一直在通过嘲笑数据访问功能来测试业务逻辑。 ,但实际上我需要业务层下面的层也要实现应用程序工作。TDD数据访问层
我应该使用TDD来实现数据访问层吗?
根据我在网上看到的讨论,单元测试不应该连接到任何外部资源,如数据库,Web服务等。如果它们连接,那么它们将成为集成测试。
请问有人可以对此有所了解。
非常感谢。
你是对的,接触到外面使得集成测试,但接触是重要的测试也是如此。使用TDD时,它应该暴露给你,接触面尽可能小。这可以通过为每个记录使用包装或类似的方法来实现。
您可以使用开发魔术假来假的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
如果你使用类似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方法中有很多逻辑,那么你应该考虑重构,并且可能将这个逻辑转移到一个服务层,在那里你可以单独测试它与任何数据库交互。