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

Posted

技术标签:

【中文标题】在 .net core 上的单元测试中使用和注入 appsettings.json【英文标题】:Using and injecting from appsettings.json in unit tests on .net core 【发布时间】:2016-11-05 10:05:23 【问题描述】:

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

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

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

Announcing MSTest Framework support for .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"));

我从下面的文章中了解了这种技术

Strongly Typed Configuration Settings in 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&lt;MySettings&gt; 用于控制器测试的控制器构造函数,以及如何让这些值传递给服务测试中的服务方法。

【问题讨论】:

Integration test with IOptions<> in .NET Core的可能重复 【参考方案1】:

只需引用 Options 包并使用

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

    ...
);

请参阅here 获取源代码参考。

【讨论】:

以上是关于在 .net core 上的单元测试中使用和注入 appsettings.json的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core 单元测试 - 模拟 IOptions<T>

.NET Core 的 NUnit Entity Framework 集成测试依赖注入问题

如何在 Bamboo 中运行 .NET Core 单元测试?

如何在 ASP.NET Core 中使用 ILogger 进行单元测试

无法使用 ConfigurationManager 在 C# .NET Core 单元测试项目中读取 app.config

无法使用 .NET Core 运行 xUnit 测试