我应该嘲笑哪个对象?
我正在写一个存储库。对象的获取是通过DAO完成的。创建和更新对象是通过一个Request对象完成的,该对象被提供给RequestHandler对象(一种命令模式)。我没有编写DAO,Request或者RequestHandler,所以无法对其进行修改。
我正在尝试为此存储库编写测试。我已经嘲笑了DAO和RequestHandler。我的目标是让模拟的RequestHandler只需将新对象或者更新的对象添加到模拟的DAO中。这将产生我正在与数据库交谈的错觉。这样,我不必为所有调用此存储库的类模拟存储库。
问题在于,Request对象是字符串blob和各种字母数字代码的对象。我很确定XML也参与其中。有点混乱。另一位开发人员正在编写代码以根据要存储的对象创建Request对象。而且由于RequestHandler接受了Requests而不是我要存储的对象,因此它无法更新模拟的DAO。
所以问题是:我是否也模拟请求,还是应该等到另一个比较慢的家伙在编写测试之前完成他的代码?还是在测试调用存储库的类时将其拧紧并模拟出整个存储库?
顺便说一句,我说的"模拟"不是NMock的意思,而是像用内存中的集合伪造数据库一样。
解决方案
为了测试存储库,我建议我们对所有较低层的对象使用测试倍数。
为了测试依赖于存储库的类,我建议我们对存储库使用测试倍数。
在这两种情况下,我的意思是由某个模拟库创建的测试双打(伪造适用于该测试的地方,需要在其中返回一些内容到被测对象的存根(如果确实需要,则进行模拟))。
如果要使用内存中的集合创建DAO的实现,以在功能上替换演示或者测试系统中的数据库,而该演示系统或者测试系统与对上层进行单元测试不同。我做了类似的事情,这样我就可以为人们提供原型,并专注于业务对象而不是物理模型。但是,这不是用于单元测试的。
我们可能没有创建Web应用程序,但是可以看看使用Repository的NerdDinner应用程序。它是一个免费的PDF,解释了如何使用ASP.NET MVC创建应用程序,可以在以下位置找到:Professional ASP.NET MVC 2.0