我正在关注此guide。我在API项目中有Startup
使用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<Startup>());
_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
1}}测试项目本身的文件)因此测试在创建TestServer
时失败。
我尝试通过修改测试project.json
文件来解决这个问题。
"buildOptions": {
"emitEntryPoint": true,
"copyToOutput": {
"includeFiles": [
"appsettings.json"
]
}
}
我希望这会将appsettings.json
文件复制到构建输出目录,但它抱怨项目缺少入口点的Main
方法,将测试项目视为控制台项目。
我该怎么做才能解决这个问题?我做错了吗?
答案 0 :(得分:13)
集成测试关注MS guide,
您应该右键点击appsettings.json
将其属性Copy to Output directory
设置为始终复制
现在您可以在输出文件夹中找到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<TestStartup>());
参考:TestServer w/ WebHostBuilder doesn't read appsettings.json on ASP.NET Core 2.0, but it worked on 1.1
答案 1 :(得分:8)
最后,我将此guide,特别是集成测试部分放在页面底部。这样就无需将appsettings.json
文件复制到输出目录。相反,它告诉测试项目Web应用程序的实际目录。
至于将appsettings.json
复制到输出目录,我还设法让它工作。结合 dudu 的答案,我使用include
代替includeFiles
,因此结果部分看起来像这样:
"buildOptions": {
"copyToOutput": {
"include": "appsettings.json"
}
}
我不完全确定为什么会这样,但确实如此。我快速查看了文档,但找不到任何真正的差异,因为原来的问题基本上已经解决了,所以我没有进一步了解。
答案 2 :(得分:1)
删除测试"emitEntryPoint": true
文件中的project.json
。