如何测试在不实际执行查询的情况下查询数据库的方法
本文关键字:查询 执行 情况下 方法 数据库 不实际 何测试 测试 | 更新日期: 2023-09-27 18:24:51
我正在尝试编写一个单元测试,该测试将对从方法返回的字符串执行检查。该字符串是实体的一部分,应该通过对数据库的调用生成。我可以很容易地存根这样的实体,但我不知道如何省略对数据库的调用,因为它是方法的一部分。
方法如下:
private string GetDescriptionForRelationEntry(string relAttrId, string client)
{
// here we are querying the database
var relationEntities = new EntityDatabaseQuery<AttributeEntryEntity>();
// the rest of the method
}
指定为the rest of the method
的部分需要执行,因为我必须获得字符串结果才能执行必要的检查。所以,基本上,我只需要"伪造"一行代码。
现在我还不能说明SUT类允许进行多大范围的修改,因此我不会将这个问题限制在任何特定的解决方案中。任何帮助都将不胜感激。
通常可测试类是某个接口的实现或某个抽象类的派生类。
因此,您可以使用控制容器倒置框架,如Castle Windsor、Ninject或任何您更喜欢的框架,并提供整个接口的伪实现,它不会访问数据库,但会返回测试查询结果。
您可以简单地创建一个mock方法来表示您的DB结果使用此链接了解更多详细信息:http://msdn.microsoft.com/en-us/library/ff650441.aspx
我建议您研究一种可以将数据库封装在内存中的解决方案。例如,Effort库。
Effort是一个强大的工具,可以方便地创建基于实体框架的应用程序的自动化测试。是的基本上是一个执行上所有数据操作的ADO.NET提供程序一个轻量级的进程内主内存数据库,而不是传统的外部数据库。它还提供了一些直观的辅助方法使此提供程序与现有ObjectContext或DbContext类。对现有代码进行简单的添加就足够了创建可以在不存在外部数据库。
我在这个答案中解释了我是如何使用它的:它用于实体框架,但我认为在您的情况下也可以使用相同的行为。
大多数mocking框架都要求您更改解决方案的体系结构,创建和实现接口,并动态加载实现。
但是,您也可以使用Microsoft Fakes,这不需要更改您的应用程序。Visual Studio附带了Fakes,因此您不需要下载或安装任何东西。
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/hh549175.aspx
Microsoft Fakes通过用存根或垫片替换应用程序的其他部分来帮助您隔离正在测试的代码。这些是受测试控制的小代码段。