在ms docs Hosting in ASP.NET Core最后一节中说明:
如果通过直接注入
IStartup
来构建主机 依赖注入容器而不是调用UseStartup
或Configure
,可能会出现以下错误:
Unhandled Exception: System.ArgumentException: A valid non-empty application name must be provided.
这是因为
applicationName(ApplicationKey)
(当前 需要扫描HostingStartupAttributes
。如果应用程序 手动将IStartup
注入依赖注入容器,添加 以下调用WebHostBuilder
并指定了程序集名称:
WebHost.CreateDefaultBuilder(args)
.UseSetting("applicationName", "<Assembly Name>")
...
我无法弄清楚上面粗体第一行的含义。您如何直接将IStartup
注入依赖注入容器?这是否意味着将启动实例传递到某个构造函数(不太可能)?文档指向an example以获取有关使用UseStartup<>
注入语法添加正常启动和注入启动的更多信息。我看到的唯一区别是注入由Ihostingstartup
实现调用,但是&#34;必要&#34; UseSetting()
中没有一个被调用。上面大胆的句子是什么意思?
答案 0 :(得分:1)
您如何直接将IStartup注入依赖项 注射容器?
您可以通过
执行此操作IWebHostBuilder webbuilder = new WebHostBuilder().ConfigureServices(services =>
{
services.AddSingleton<IStartup>(mockStartup);
}).UseSetting(WebHostDefaults.ApplicationKey, "<ApplicationAssemblyName>");
是否意味着将启动实例传递到某个构造函数中 (不太可能)?
这意味着注册您自己的Startup
类实例。
如果您正在考虑模拟Startup
类并使用您自己的(模拟的)实例来控制器的依赖项,那么控制器将在您的集成单元测试运行时使用您的模拟依赖项,那么您会更多可能通过将Startup
类直接注入注入容器来构建主机。
假设你必须测试你的控制器返回适当的HTTP状态代码,同时它还使用Asp.net核心过滤器验证输入参数,你想在你的单元测试方法中写这样的东西:
HttpResponseMessage response = await httpclient.PostAsync($"/api/{controllerName}", jsonContent);
然后在你可以做的断言区域......
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Created));
控制器操作如下所示:
[HttpPost]
[ValidateJobDetailsRequest]
public async Task<IActionResult> AddNewJobRequest([FromBody] AddNewRequest addNewlRequest)
{
Entity detailEntity = this._mapper.Map<AddNewRequest , Entity>(addNewlRequest);
await this._manager.AddRequest(detailEntity);
this._logger.LogInformation($"The detail = {jobDetailRequest} has successfully been dispatched.");
return Created(string.Empty, addNewlRequest);
}
如果您要直接测试此方法,那么您不会测试检查模型是否有效的ValidateJobDetailsRequest
,如果模型无效,则返回错误请求(HTTP 400)状态。
如果我遗漏了任何内容,你可以在评论中提出任何问题。