如何在不实际执行查询的情况下测试查询数据库的方法?

时间:2014-09-29 07:56:15

标签: c# database unit-testing

我正在尝试编写一个单元测试,它将对从方法返回的字符串执行检查。该字符串是实体的一部分,应该通过调用数据库生成。我可以轻松地存根这样的实体,但我不知道如何省略对数据库的调用,因为它是方法的一部分。

方法如下:

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的部分,因为我必须获取字符串结果才能执行必要的检查。所以,基本上,我需要&#34;假&#34;只有一行代码。

目前我还不能说如何允许对SUT类进行大量修改,因此我不会将此问题限制在任何特定的解决方案中。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

通常,可测试类是某个接口的实现或某个抽象类的派生类。

因此,您可以使用像Castle Windsor,Ninject或任何您可能喜欢的控制容器框架的反转,并提供整个界面的实现它不会击中数据库,但会返回测试查询结果。

答案 1 :(得分:2)

您只需创建一个模拟方法来表示您的数据库结果 使用此链接可获取更多详细信息:http://msdn.microsoft.com/en-us/library/ff650441.aspx

答案 2 :(得分:1)

我建议你看一下让你把数据库包装在内存中的解决方案。例如,有the Effort library

  

Effort是一个功能强大的工具,可以方便地创建   基于Entity Framework的应用程序的自动化测试。它是   基本上是一个执行所有数据操作的ADO.NET提供程序   一个轻量级的进程内主数据库而不是传统的数据库   外部数据库。它也提供了一些直观的辅助方法   使用现有的ObjectContext或使用此提供程序非常容易   DbContext类。对现有代码的简单添加可能就足够了   创建数据驱动的测试,可以在没有存在的情况下运行   外部数据库。

我在this answer中解释了我如何使用它:它适用于实体框架,但我认为在您的情况下可以使用相同的行为。

答案 3 :(得分:0)

大多数模拟框架都要求您更改解决方案的体系结构,创建和实现接口,以及动态加载实现。

但是,您也可以使用Microsoft Fakes,它不需要更改您的应用程序。 Visual Studio带有假货,因此您无需下载或安装任何内容。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/hh549175.aspx

  

Microsoft Fakes通过使用存根或填充程序替换应用程序的其他部分来帮助您隔离正在测试的代码。这些是受测试控制的小段代码。