2014-09-29 100 views
1

我想写一个单元测试,将执行检查从方法返回的字符串。该字符串是实体的一部分,应该通过调用数据库来生成。我可以很容易地存根这个实体,但我不知道如何省略对数据库的调用,因为它是方法的一部分。如何在没有实际执行查询的情况下测试查询数据库的方法?

的方法是这样的:

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类的广泛修改是允许的,因此我并没有将这个问题限制到任何特定的解决方案。任何帮助将不胜感激。

回答

2

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

因此,你可以使用像温莎城堡,Ninject或任何可能你更多的控制容器框架的反转,并提供实现整个界面,将不会打的数据库,但它会返回一个测试查询结果。

2

您可以简单地创建一个模拟的方法来表示您的数据库结果 使用此链接了解详情:http://msdn.microsoft.com/en-us/library/ff650441.aspx

+0

我不知道这将如何帮助我,因为我需要该方法的第二部分(未显示在代码段中)执行。我将编辑我的帖子以说清楚。 – Kapol 2014-09-29 08:16:35

0

大部分嘲弄框架,要求你改变你的解决方案的架构,创造和实现接口,并装载实现动态。

但是,您也可以使用Microsoft Fakes,它不需要更改您的应用程序。虚假来与Visual Studio,所以你不需要下载或安装任何东西。

欲了解更多信息,请参阅http://msdn.microsoft.com/en-us/library/hh549175.aspx

微软正版正货承诺帮助您隔离被替换为存根或垫片应用程序的其他部分测试代码。这些是受测试控制的小部分代码。

1

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

Effort是一个功能强大的工具,可以方便地为基于实体框架的应用程序创建自动化测试 。它基本上是一个ADO.NET提供程序,它在 上执行一个轻量级进程内存数据库,而不是传统的外部数据库。它提供了一些直观的帮助程序方法, 可以很容易地将此​​提供程序与现有ObjectContext或 DbContext类一起使用。对现有代码的简单添加可能足以创建可在没有外部数据库的情况下运行的数据驱动的测试。

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

相关问题