Rab*_*spo 12 c# unit-testing dependency-injection .net-core asp.net-core
我做一个单元测试项目来测试我的webapi,我需要初始化一个控制器,问题是在构造函数中它收到一个IConfiguration,它是通过依赖注入提供的,并且工作正常.
但是当我想手动初始化它时,我无法得到这个实例.
我试图从同一个项目中的单元测试项目初始化它.
控制器看起来像:
public Controller(IConfiguration configuration) { _configuration = configuration; }
Run Code Online (Sandbox Code Playgroud)
Cod*_*ler 26
我可能应该从.Net Core应用程序中的语句开始,你不应该将实例传递IConfiguration给你的控制器或其他类.您应该使用注入的强类型设置IOptions<T>.有关更多详细信息,请参阅此文章:ASP.NET Core中的选项模式.
使用选项模式时,您将获得控制器所需设置的POCO.然后将此设置对象注入到包含的控制器中IOptions<T>:
public class ControllerSettings
{
public string Setting1 { get; set; }
public int Setting2 { get; set; }
// ...
}
public class Controller
{
private readonly ControllerSettings _settings;
public Controller(IOptions<ControllerSettings> options)
{
_settings = options.Value;
}
}
Run Code Online (Sandbox Code Playgroud)
然后从单元测试中传递您想要的任何设置非常简单.只需填充设置实例并IOptions<T>使用任何可用的模拟框架(如Moq或NSubstitute)进行换行:
[TestMethod]
public void SomeTest()
{
var settings = new ControllerSettings
{
Setting1 = "Some Value",
Setting2 = 123,
};
var options = new Mock<IOptions<ControllerSettings>>();
options.Setup(x => x.Value).Returns(settings);
var controller = new Controller(options.Object);
// ...
}
Run Code Online (Sandbox Code Playgroud)
有时需要使用项目的实际配置,例如在开发集成测试时.在这种情况下,您可以使用ConfigurationBuilder与测试代码中相同的配置源创建实例并填充它:
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
// Duplicate here any configuration sources you use.
configurationBuilder.AddJsonFile("AppSettings.json");
IConfiguration configuration = configurationBuilder.Build();
Run Code Online (Sandbox Code Playgroud)