NUnit 和 app.config 的问题

Posted

技术标签:

【中文标题】NUnit 和 app.config 的问题【英文标题】:The problem with NUnit and app.config 【发布时间】:2011-01-25 10:29:29 【问题描述】:

当我在连接到 DB 检查时运行一个简单的测试时,我在 NUnit 中收到一个错误:

[Test]
public void TestConn()

    string  connectionString = ConfigurationManager.ConnectionStrings["FertigungRead"].ConnectionString;
    SqlConnection connection = new SqlConnection(connectionString);
    connection.Open();
    Assert.AreEqual(ConnectionState.Open, connection.State);
    connection.Close();
 

System.NullReferenceException : 对象引用未设置为对象的实例。

上线:

connectionString = ConfigurationManager.ConnectionStrings["FertigungRead"].ConnectionString;

我可以在测试中使用 ConfigurationManager 吗?

【问题讨论】:

遇到了同样的问题。问题是,当你使用 nunit.exe 运行测试时(不知道你是否也使用那个),它使用了 nunit 的 app.config。当然,您可以将连接字符串放在那里,但是有点奇怪,这个(现有)文件中有一行说“不要用它来存储您自己的应用程序设置”(我们可以随意忽略它,但它看来一定有另一种可能) 通常,这与运行 NUnit 时配置文件相对于“当前目录”的位置、配置文件的名称以及运行单元测试的方式有关(例如,直接在NUnit中打开.dll,还是打开一个项目?)。你能澄清这三件事吗? 我现在遇到了同样的问题:***.com/questions/11517214/… 【参考方案1】:

是的,你可以。您需要确保您在测试中引用的任何配置实际上都存在于测试项目的app.config 中。

换句话说,您的测试所在的项目在其app.config 中没有定义连接字符串"FertigungRead"

一种方法是将被测系统的app.config 添加到测试项目as a link,这样任何更改都会发生在两个项目上。

【讨论】:

【参考方案2】:

只要您的测试项目的配置与主项目的配置相同,您的单元测试应该仍然有效。

我建议在您的测试项目中使用预构建事件将应用程序的配置文件复制到测试项目中。这样就不必维护两组配置。

复制 $(SolutionDir)path-to-main-project\Web.config $(ProjectDir)App.config

【讨论】:

【参考方案3】:

为什么需要单元测试来查看 SqlConnection 是否有效?你应该测试你的代码,而不是微软的。我真的看不出在单元测试中检查连接字符串是否正确的意义。单元测试使用的配置与您的生产代码将使用的配置不同。

不过,一般来说,如果您需要一些用于单元测试的配置数据,请在测试项目中创建一个 app.config 文件。使用适合您的测试环境的值填充 appSettings 和 connectionStrings 元素等。不过,不要费心测试 ConfigurationManager 或 SqlConnection 是否有效。您将只是创建必须维护的代码,但这实际上并不能验证您正在编写的任何生产代码。

【讨论】:

先是单元测试,然后是集成测试。您必须在某个时候测试您的 SQL(持久层)代码是否有效!此外,您确实希望至少进行一些端到端测试。 更不用说 NUnit 也用于运行 Selenium UI 测试之类的东西。是的,它主要是一个单元测试框架,但这并不是它的全部用途。 @csauve 的重点是他只检查连接字符串是否有效......没有别的。 可以安全地假设问题是一个通用示例,以便更容易理解重要部分。【参考方案4】:

看我的回答nunit and configs 您需要告诉 nunit 配置文件的名称是什么。默认情况下它会查找 namespace.config 它接缝

【讨论】:

【参考方案5】:

男人看看:http://nunit.net/blogs/?p=9

按照他的建议,我将MyProjectTests.dll.config 放在项目根目录中,一切正常。

我的配置文件的一个例子是:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
     <add key="TestKey" value="Ok!"/>
</appSettings>
</configuration>

我使用的是简单的:ConfigurationManager.AppSettings["TestKey"];

【讨论】:

【参考方案6】:

我想补充一点。 nunit 的文档中有一个注释,应该根据使用场景配置文件命名和放置。我在这个问题上停留了一段时间。

文档说:

如果正在加载单个程序集,则配置文件将被赋予带有配置扩展名的程序集文件的名称。例如,用于运行 nunit.tests.dll 的配置文件必须命名为 nunit.tests.dll.config 并位于与 dll 相同的目录中。

如果正在加载 NUnit 项目,则配置文件使用扩展名更改为 config 的项目文件的名称。例如,项目 AllTests.nunit 将需要名为 AllTests 的配置文件.config,位于与 AllTests.nunit 相同的目录中。加载 Visual Studio 项目或解决方案时遵循相同的规则。

http://www.nunit.org/index.php?p=configFiles&r=2.2.10

【讨论】:

【参考方案7】:
    转到 NUnit/项目/编辑... 在配置属性面板中转到配置文件名 放在那里 yourAssemblyName.dll.config

注意:如果不起作用,请尝试为其添加路径,例如bin\Debug\ yourAssemblyName.dll.config

您的测试项目文件yourAssemblyName.nunit 将被更新。

是的,请确保您的测试项目中的 App.config 与您在测试中访问的内容相匹配,即

[Test]
public void TestConn()

   var sss = ConfigurationManager.AppSettings["TestKey"];

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="TestKey" value="testKeyValue"/>
  </appSettings>
</configuration>

【讨论】:

【参考方案8】:

在运行测试的项目中使用配置文件时,必须遵循特定的命名约定。

配置文件名应该是带有配置扩展名的程序集文件名。例如,用于运行MyUnitTest.tests.dll的配置文件必须命名为MyUnitTest.tests.dll.config,并且应该与MyUnitTest.nunit在同一目录下

我们也可以像下面这样在预构建中配置它

copy $(SolutionDir)path-to-main-project\Web.config $(ProjectDir)App.config 

【讨论】:

【参考方案9】:

我遇到了同样的情况,我尝试将 app.config 添加到 NUnit 项目,但项目无法识别它。 对我来说,棘手的解决方法是创建一个包含应用程序配置的类库并将其提交到我的测试项目中。归根结底,所有 NUnit 及其适配器都是 NuGet 包,可以将这些包添加到类库中进行测试,并且测试可以由 Visual Studio 和 Resharper 完美运行。

最后调试了我的测试并从我的测试项目中的App.config 文件中接收到值:

【讨论】:

以上是关于NUnit 和 app.config 的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 NUnit 对 app.config 文件进行单元测试

使用 NUnit 时,我应该如何在运行时修改 app.config?

在 .NET Core 控制台应用程序中使用带有 NUnit3 的 app.config 文件

app.config 在哪里

MSTest 和 app.config 问题

App.Config 和 Web.Config 的区别?