Testing 我应该使用内存中的数据库而不是模拟我的存储库吗?

Testing 我应该使用内存中的数据库而不是模拟我的存储库吗?,testing,mocking,Testing,Mocking,我喜欢在测试时使用内存中的数据库,比如SQLite,而不是为我的存储库创建模拟。通过这种方式,我还可以测试存储库的代码,而不会出现任何性能问题 此策略的优缺点是什么?我的策略是,在测试业务代码时,模拟存储库。在测试我的存储库时,我模拟了我的数据访问层。我尽可能多地为我的数据访问层(LINQ到SQL)使用自动生成的代码,因此没有太多可测试的内容。有什么(验证材料,专门的属性处理),通常可以直接测试,没有模拟。如果绝对必要(或更简单),我有时会用一个基于列表的自定义内存存储来伪造数据层——请参阅我的

我喜欢在测试时使用内存中的数据库,比如SQLite,而不是为我的存储库创建模拟。通过这种方式,我还可以测试存储库的代码,而不会出现任何性能问题


此策略的优缺点是什么?

我的策略是,在测试业务代码时,模拟存储库。在测试我的存储库时,我模拟了我的数据访问层。我尽可能多地为我的数据访问层(LINQ到SQL)使用自动生成的代码,因此没有太多可测试的内容。有什么(验证材料,专门的属性处理),通常可以直接测试,没有模拟。如果绝对必要(或更简单),我有时会用一个基于列表的自定义内存存储来伪造数据层——请参阅我的博客,我在那里写过这篇文章。

我想说这两种策略是两件不同的事情。
正如您自己所说,使用内存中的db,您也可以测试存储库,但是,您必须首先测试存储库,以实现关注点的分离。当您设计系统时,可能根据MVC,您希望控制器先于模型/存储库,因为首先您必须决定要做什么,然后再决定哪些实体将协作实现该目标。因此,也许首先创建控制器和模拟存储库是一种更好的方法,之后,如果设置起来非常简单,您可以使用内存中的数据库来测试存储库。

如果我使用的是ORM,我通常倾向于使用sqlite内存数据库来测试我的应用程序,因为我没有设置模拟和预期结果的开销。使用虚拟数据库可以提高速度,但我不希望它比使用模拟数据库快。如果我使用的是SQL适配器,我可能会使用模拟,因为否则,我可能必须重写调用。

使用内存中的适配器会给您带来模拟所没有的优势。使用内存数据库,您可以轻松地更改代码实现,而无需更改测试中的任何内容。例如,如果使用ORM,您可以使用
insert
方法将表单移动到
bulkInsert
方法,而无需模拟新添加的
bulkInsert
方法。

是的,我相信您是对的。这是为了实现不同的目标而做的不同的事情。