我做了一个单元测试项目来测试我的webapi,我需要初始化一个控制器,问题是在构造函数中它收到一个IConfiguration,它是通过依赖注入提供的,并且工作正常。
但是当我想手动初始化它时,我无法得到这个实例。
我正在尝试从同一项目内部的单元测试项目初始化它。
控制器看起来像:
public Controller(IConfiguration configuration) { _configuration = configuration; }
答案 0 :(得分:20)
我可能应该从.Net Core应用程序中的语句开始,你不应该将IConfiguration
的实例传递给你的控制器或其他类。您应该使用通过IOptions<T>
注入的强类型设置。有关详细信息,请参阅此文章:Options pattern in 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;
}
}
然后从单元测试中传递您想要的任何设置非常简单。只需使用任何可用的模拟框架(例如Moq或NSubstitute)填充设置实例并换行到IOptions<T>
:
[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);
// ...
}
有时需要使用项目的实际配置,例如在开发集成测试时。在这种情况下,您可以创建ConfigurationBuilder
的实例,并使用与测试代码中相同的配置源填充它:
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
// Duplicate here any configuration sources you use.
configurationBuilder.AddJsonFile("AppSettings.json");
IConfiguration configuration = configurationBuilder.Build();