从应用设置中使用和注入.Json在.net core上的单元测试

本文关键字:net core 单元测试 Json 注入 设置 应用 | 更新日期: 2023-09-27 17:54:30

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

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

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

宣布MSTest框架支持。net Core RC2/ASP。. NET Core RC2

我已经将应用程序组织到控制器和服务中,控制器从appsettings读取值。

我有一个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中的强类型配置设置网络核心

这在运行时工作,但是我在单元测试中访问这些设置有困难。

我正试图找到一种方法从应用程序设置中获取值。

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

[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>到控制器构造函数,用于控制器测试,以及如何将这些值传递给服务测试中的服务方法。

从应用设置中使用和注入.Json在.net core上的单元测试

直接引用Options包并使用

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

查看这里的源代码参考。