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

C# 如何测试在不实际执行查询的情况下查询数据库的方法?,c#,database,unit-testing,C#,Database,Unit Testing,我正在尝试编写一个单元测试,它将对方法返回的字符串执行检查。该字符串是实体的一部分,应该通过调用数据库生成。我可以很容易地存根这样的实体,但我不知道如何省略对数据库的调用,因为它是方法的一部分 方法如下所示: private string GetDescriptionForRelationEntry(string relAttrId, string client) { // here we are querying the database

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

方法如下所示:

private string GetDescriptionForRelationEntry(string relAttrId, string client)
        {
            // here we are querying the database
            var relationEntities = new EntityDatabaseQuery<AttributeEntryEntity>();

            // the rest of the method
        }
private string GetDescriptionForRelationEntry(string-relAttrId,string-client)
{
//这里我们查询数据库
var relationEntities=new EntityDatabaseQuery();
//方法的其余部分
}
指定为
的部分需要执行方法的其余部分,因为我必须获得字符串结果才能执行必要的检查。所以,基本上,我只需要“伪造”一行代码


现在我不能说SUT类允许进行多大范围的修改,因此我不会把这个问题局限于任何特定的解决方案。任何帮助都将不胜感激。

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


因此,您可以使用Castle Windsor、Ninject或任何您更喜欢的控制反转容器框架,并提供一个不会影响数据库的整个接口的伪实现,但它将返回一个测试查询结果。

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


因此,您可以使用Castle Windsor、Ninject或任何您更喜欢的控制反转容器框架,并提供整个接口的假实现,它不会影响数据库,但会返回测试查询结果。

您只需创建一个模拟方法来表示DB结果
使用此链接了解更多详细信息:

您只需创建一个模拟方法来表示DB结果
使用此链接了解更多详细信息:

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

但是,您也可以使用Microsoft Fakes,它不需要更改您的应用程序。VisualStudio附带了赝品,因此您不需要下载或安装任何东西

有关详细信息,请参阅

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


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

但是,您也可以使用Microsoft Fakes,它不需要更改您的应用程序。VisualStudio附带了赝品,因此您不需要下载或安装任何东西

有关详细信息,请参阅

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


我建议您看看一个解决方案,它可以让您在内存中封装数据库。例如有

努力是一个强大的工具,可以方便地创建 基于实体框架的应用程序的自动化测试。它是 基本上是一个ADO.NET提供程序,它在上执行所有数据操作 一个轻量级进程内主存数据库,而不是传统的 外部数据库。它还提供了一些直观的辅助方法 使此提供程序与现有的ObjectContext或 DbContext类。对现有代码进行简单的添加就足够了 创建数据驱动的测试,这些测试可以在没有 外部数据库


我解释了如何在中使用它:它是用于实体框架的,但我认为同样的行为也可以在您的案例中使用。

我建议您看看一个解决方案,它可以将数据库包装到内存中。例如有

努力是一个强大的工具,可以方便地创建 基于实体框架的应用程序的自动化测试。它是 基本上是一个ADO.NET提供程序,它在上执行所有数据操作 一个轻量级进程内主存数据库,而不是传统的 外部数据库。它还提供了一些直观的辅助方法 使此提供程序与现有的ObjectContext或 DbContext类。对现有代码进行简单的添加就足够了 创建数据驱动的测试,这些测试可以在没有 外部数据库


我解释了如何在中使用它:它用于实体框架,但我认为同样的行为也可以在您的案例中使用。

我不确定这对我有什么帮助,因为我需要执行方法的第二部分(代码段中未显示)。我将编辑我的文章以澄清这一点。我不确定这对我有什么帮助,因为我需要执行方法的第二部分(代码段中未显示)。我将编辑我的帖子以使其清晰。