c# - 模拟时,IConfiguration 不断获取空值
问题描述
我可以询问我是否正确地模拟了我的 IConfiguration,因为我一直收到一个空错误。我试图在读取 appsettings.json 的地方模拟我的控制器。
ControllerOne.cs
private readonly IConfiguration _configuration;
public Controller(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpPost("upload")]
public async Task<IActionResult> UploadFile([FromForm(Name = "files")] List<IFormFile> files, CancellationToken cancellationToken = default)
{
string directory = _configuration.GetValue<string>("ShippingService:ServerDirectory");
string subDirectory = _configuration.GetValue<string>("ShippingService:UploadRateSubDirectory");
}
控制器测试.cs
public class ControllerTest: ControllerTestsBase<ControllerOne>
{
[Fact]
public void TestOne()
{
IFormFile file = new FormFile(new MemoryStream(Encoding.UTF8.GetBytes("This is a dummy file")), 0, 0, "Data", "dummy.txt");
List<IFormFile> formFiles = new List<IFormFile>();
formFiles.Add(file);
//when
await Controller.UploadFile(formFiles, default);
}
}
ControllerTestsBase.cs
public abstract class ControllerTestsBase<T>
where T : ApiControllerBase
{
protected readonly T Controller;
protected readonly AutoMocker Mocker;
protected ControllerTestsBase()
{
Mocker = new AutoMocker();
var httpResponseMock = Mocker.GetMock<HttpResponse>();
httpResponseMock.Setup(mock => mock.Headers).Returns(new HeaderDictionary());
var httpRequestMock = Mocker.GetMock<HttpRequest>();
var httpContextMock = Mocker.GetMock<HttpContext>();
httpContextMock.Setup(mock => mock.Response).Returns(httpResponseMock.Object);
httpContextMock.Setup(mock => mock.Request).Returns(httpRequestMock.Object);
var fakeValues = new Dictionary<string, string>
{
{"ShippingService:ServerDirectory", "abc"},
{"ShippingService:UploadRateSubDirectory", "test.com"}
};
IConfiguration config = new ConfigurationBuilder()
.AddInMemoryCollection(fakeValues)
.Build();
Controller = Mocker.CreateInstance<T>();
Controller.ControllerContext.HttpContext = httpContextMock.Object;
}
}
当我调试并跟踪到Controller.cs methodOne时,_configuration 一直提示 null 错误。
- 为代码片段道歉,我再次更新了代码。
- 我还意识到我之前在这里的帖子c# Mock IConfiguration keep get null正在关闭,因为我之前发布了一些无法编译的内容。
解决方案
文档状态:
如果您有需要使用的特殊实例,可以使用 .Use(...) 注册它。这与常规 IoC 容器中的注册非常相似(即 StructureMap 中的 For().Use(x))。
因此我希望这会起作用:
IConfiguration config = new ConfigurationBuilder()
.AddInMemoryCollection(fakeValues)
.Build();
Mocker.Use<IConfiguration>(config);
Controller = Mocker.CreateInstance<T>();
Controller.ControllerContext.HttpContext = httpContextMock.Object;
推荐阅读
- apache - 在页面请求上运行外部命令
- tensorflow - 有没有办法在不同的 GPU 上运行批次的每个部分?
- css - CSS 网格在使用分数和屏幕尺寸百分比时创建不成比例的布局
- c - 如何保留稍后销毁的字符串的内容?
- c++ - 获取第一个模板参数的稳健方法
- ruby-on-rails - 在 Rails 中连接 API 时存储 JWT 的位置
- firebase - 如何在同一用户消息中多次添加battery_cost_change和firebase中的计数器值,即LM2JKCacawaW7tlK4yK
- javascript - 我可以让 Obect 属性调用一个函数吗
- jquery - 仅显示单击的 div,带切换
- c++ - C++ 向量初始化遗传算法的代理向量