25

我正在尝试为我的项目编写单元测试,但它不允许我使用配置管理器。现在我的项目设置如下

ASP.Net 应用程序(所有 aspx 页面)

ProjectCore(所有 C# 文件 - 模型)

ProjectTest(所有测试)

在我的 ProjectCore 中,我能够从 System.Configuration 访问 ConfigurationManager 对象并将信息传递到项目中。但是,当我运行涉及 ConfigurationManager 的测试时,我得到了错误

System.NullReferenceException: Object reference not set to an instance of an object.

这是一个测试的例子

using System.Configuration;

[TestMethod]
public void TestDatabaseExists()
{
    //Error when I declare ConfigurationManager
    Assert.IsNotNull(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString
}

在我的其他测试中,ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString 是我将数据适配器的配置字符串设置为的内容,并在测试中返回空错误,但在我实际使用网站时却没有。有任何想法吗?

4

5 回答 5

29

这可能是几个问题之一:

  1. 您没有将 app.config 添加到您的 ProjectTest 项目中。
  2. 您没有在 app.config 中添加连接字符串。

于 2013-07-10T20:52:13.620 回答
3

您正在进行单元测试,并且在单元测试中,您的注意力应该是尝试测试的特定方法,并且应该删除无关的依赖项。在这种情况下,请尝试 mocking/moleing(使用 Microsoft Mole 和 Pex)system.configuration类;这肯定会给出一个解决方案。

我的意思是,一旦你安装了 MS moles-and-pex -> 在你的测试项目解决方案中 -> 右键单击​​系统程序集并选择创建痣。

这将为您提供一个配置类的mole'ed 版本,该配置类又将具有一个模拟版本configuration class-- 使用它您可以绕过您面临的问题。

于 2013-07-10T20:52:32.973 回答
2

您还可以使用特殊的配置路径ExeConfigurationFileMap

// Get the machine.config file.
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
// You may want to map to your own exe.config file here.
fileMap.ExeConfigFilename = @"C:\test\ConfigurationManager.exe.config";
// You can add here LocalUserConfigFilename, MachineConfigFilename and RoamingUserConfigFilename, too
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
于 2016-09-06T12:41:45.520 回答
1

它与 mstest.exe 命令行中的 /noisolation 参数有关。省略 /noisolation 参数,它可以工作。

于 2016-08-31T13:04:28.623 回答
0

首先,您必须确保您的 nunit 测试项目中有一个 app.config 文件。

要添加它,您可以打开项目属性(右键单击项目) 在此处输入图像描述

输入连接的详细信息,它将生成一个 app.config 文件或在其中添加正确的部分:

在此处输入图像描述

在您的 Test 类中,添加对: System.Configuration; 的引用 => 使用 System.Configuration;

例如,您可以通过这种方式使用您的 connectionString :

[TestFixture]
public class CommandesDALUnitTest
{

    private string _connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

    [Test]
    public void Method_Test()
    {
        string test = _connectionString;
            ....
    }
}
于 2020-09-06T18:18:22.383 回答