繁体   English   中英

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

[英]Using and injecting from appsettings.json in unit tests on .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; 
    }
}

控制器构造函数如下

public ValuesController(IOptions<AppSettings> settings)
{            
    App.ConfigureSettings(settings);
}

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

services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

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

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);
}

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

只需参考Options包并使用即可

IOptions<MyOptions> options = Options.Create(new MyOptions()
{
    ...
});

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM