AppSettings.json用于ASP.NET核心中的集成测试

我正在遵循本指南 。 我在API项目中有一个使用appsettings.json配置文件的appsettings.json

 public class Startup { public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build(); Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .ReadFrom.Configuration(Configuration) .CreateLogger(); } 

我正在看的特定部分是env.ContentRootPath 。 我做了一些挖掘,看起来我的appsettings.json实际上并没有复制到bin文件夹,但是这很好,因为ContentRootPath返回了MySolution\src\MyProject.Api\ ,这是appsettings.json文件所在的位置。

所以在我的集成测试项目中,我有这个测试:

 public class TestShould { private readonly TestServer _server; private readonly HttpClient _client; public TestShould() { _server = new TestServer(new WebHostBuilder().UseStartup()); _client = _server.CreateClient(); } [Fact] public async Task ReturnSuccessful() { var response = await _client.GetAsync("/monitoring/test"); response.EnsureSuccessStatusCode(); var responseString = await response.Content.ReadAsStringAsync(); Assert.Equal("Successful", responseString); } 

这基本上是指南中的复制和粘贴。 当我调试这个测试时, ContentRootPath实际上是MySolution\src\MyProject.IntegrationTests\bin\Debug\net461\ ,这显然是测试项目的构建输出文件夹,而且appsettings.json文件不存在(是的,我确实有)测试项目本身中的另一个appsettings.json文件)因此测试在创建TestServer失败。

我尝试通过修改测试project.json文件来解决这个问题。

 "buildOptions": { "emitEntryPoint": true, "copyToOutput": { "includeFiles": [ "appsettings.json" ] } } 

我希望这会将appsettings.json文件复制到构建输出目录,但它抱怨项目缺少入口点的Main方法,将测试项目appsettings.json控制台项目。

我该怎么做才能解决这个问题? 难道我做错了什么?

最后,我按照本指南 ,特别是页面底部的集成测试部分。 这样就无需将appsettings.json文件复制到输出目录。 相反,它告诉测试项目Web应用程序的实际目录。

至于将appsettings.json复制到输出目录,我还设法appsettings.json工作。 结合dudu的答案,我使用include而不是includeFiles因此结果部分看起来像这样:

 "buildOptions": { "copyToOutput": { "include": "appsettings.json" } } 

我不完全确定为什么会这样,但确实如此。 我快速查看了文档,但发现没有任何真正的差异,因为原来的问题基本上解决了,所以我没有进一步看。

ASP.NET.Core 2.0上的集成测试遵循MS指南 ,

您应该右键单击appsettings.json将其属性Copy to Output directoryCopy always

现在你可以在输出文件夹中找到json文件,然后用它构建TestServer

 var projectDir = System.IO.Directory.GetCurrentDirectory(); _server = new TestServer(new WebHostBuilder() .UseEnvironment("Development") .UseContentRoot(projectDir) .UseConfiguration(new ConfigurationBuilder() .SetBasePath(projectDir) .AddJsonFile("appsettings.json") .Build() ) .UseStartup()); 

参考: 带有WebHostBuilder的TestServer在ASP.NET Core 2.0上没有读取appsettings.json,但它在1.1上运行

在test project.json文件中删除"emitEntryPoint": true