单元测试时无法读取appsettings

New*_*per 22 c# nunit unit-testing

我有C#控制台应用程序.其功能之一是阅读appconfig价值并做一些工作.

string host = ConfigurationManager.AppSettings["Host"]  
Run Code Online (Sandbox Code Playgroud)

所以我NUNIT为我的控制台应用程序写了测试.单元测试项目是使用类库创建的.

但我的单元测试现在失败了.因为它没有读取我的应用程序设置(表示没有应用程序设置).这是什么原因.
当我运行我的控制台应用程序时,它正确地读取应用程序设置.

aqu*_*aga 32

您应该为您的单元测试项目创建一个app.config.在运行单元测试时,不会查询控制台应用程序的app.config.

  • 这意味着我还必须在我的测试项目中添加以下内容.`<appSettings> <add key ="Host"value ="localhost"/> </ appSettings>` (3认同)

bon*_*yer 11

虽然您可以在单元测试项目的另一个配置文件中定义应用程序设置,但使用依赖项注入对接口进行单元测试可能有助于将单元测试覆盖的区域分解为更易于管理的部分.

所以你可以拥有如下配置界面:

public interface IConfiguration
{
    public string Host { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你要测试的类会接受一个I​​Configuration类作为参数(通常是你的构造函数),如下所示:

public class MyClass
{
    IConfiguration _config;
    public MyClass(IConfiguration config)
    {
        _config = config;
    }

    public void MyMethodToTest()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您的测试可以使用该接口传递配置,而不是依赖于可能会更改并影响您的单元测试的外部配置文件:

[Test]
public void Testing_MyMethodToTest()
{
    // arrange
    var config = new Configuration { Host = "My Test Host" };
    // act
    new MyClass(config).MyMethodToTest();
    // Add assertion for unit test
}
Run Code Online (Sandbox Code Playgroud)

您的实际实现将创建您的配置类,使用来自appsettings的值加载它并将其传递到您的实现中