在.net核心的单元测试中使用和注入appsettings.json

7 c# mstest dependency-injection appsettings asp.net-core

我创建了一个asp.net核心Web应用程序和一个单元测试应用程序.

我使用"ASP.NET Core Web Application(.NET Core)"模板创建了asp.net应用程序,并使用"类库(.NET Core)"模板创建了单元测试项目.

我使用以下文章中的说明配置了MSTest:

宣布MSTest Framework支持.NET Core RC2/ASP.NET Core RC2

我已将应用程序组织到控制器和服务中,控制器从appsettings.json读取值并将这些值作为参数传递给服务方法.

我有一个AppSettings类如下

public class AppSettings
{
    public string Setting1 { get; set; }
    public string Setting2 { get; set; }
    public string Setting3etc { get; set; }
}

public static class App
{
    public static AppSettings Settings { get; set; }

    public static void ConfigureSettings(IOptions<AppSettings> settings)
    {
        Settings = settings.Value; 
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器构造函数如下

public ValuesController(IOptions<AppSettings> settings)
{            
    App.ConfigureSettings(settings);
}
Run Code Online (Sandbox Code Playgroud)

在Startup.cs中,我在ConfigureServices方法中有以下行

services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
Run Code Online (Sandbox Code Playgroud)

我从以下文章中了解到了这种技术

ASP.NET Core中强类型的配置设置

这在运行时工作,但我在单元测试中访问这些设置时遇到困难.

我正在尝试找到一种方法将appsettings.json中的值放入我的测试项目中,这样我就可以将它们传递给控制器​​和服务.

我的测试方法看起来像这样

[TestMethod]
[TestCategory("Service - Method1")]
public void ServiceMethod1Test()
{
    // this compiles but gets null reference exception
    var setting1 = App.Settings.Setting1;
    var setting2 = App.Settings.Setting2;

    var service = new Service(setting1, setting2);

    var argument1 = "argument";
    var actual = service.Method1(argument1);
    var expected = "expected result";

    CollectionAssert.AreEqual(expected, actual);
}

[TestMethod]
[TestCategory("Controller - Method1")]
public void ControllerMethod1Test()
{
    // how do i create this settings instance?
    var settings = ???

    var controler = new ValuesController(settings);

    var argument1 = "argument";

    var actual = controller.Method1(argument1);
    var expected = "expected result";

    CollectionAssert.AreEqual(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能将实现的类的实例传递 IOptions<MySettings>给控制器测试的控制器构造函数,我怎样才能将这些值传递给服务测试中的服务方法.

Tse*_*eng 7

只需参考Options包并使用即可

IOptions<MyOptions> options = Options.Create(new MyOptions()
{
    ...
});
Run Code Online (Sandbox Code Playgroud)

请参阅此处获取源代码参考.