我使用Microsoft.AspNet.TestHost来托管xunit集成测试。只要测试与asp.net-5-解决方案在同一个项目中,一切都会正常工作
但我想把测试放在一个单独的组件中,把它们从解决方案中分离出来。但是当我尝试在单独的解决方案中运行测试时,我遇到了一个错误,TestServer找不到视图。
Bsoft.Buchhaltung.Tests.LoginTests.SomeTest [FAIL]
System.InvalidOperationException : The view 'About' was not found. The following locations were searched:
/Views/Home/About.cshtml
/Views/Shared/About.cshtml.
我猜TestServer正在查找相对于本地目录的视图。我如何才能让它在正确的项目路径中查找?
我在这里有一个示例repo-https://github.com/mattridgway/ASPNET5-MVC6-Integration-Tests这说明了问题的解决(感谢大卫·福勒)。
TL;DR-在设置TestServer时,您需要设置应用程序基本路径来查看其他项目,以便它可以找到视图。
Matt Ridgway的答案是在RC1是当前版本时编写的。现在(RTM 1.0.0/1.0.1)这变得更简单了:
public class TenantTests
{
private readonly TestServer _server;
private readonly HttpClient _client;
public TenantTests()
{
_server = new TestServer(new WebHostBuilder()
.UseContentRoot(Path.GetFullPath(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "..", "..", "..", "..", "..", "SaaSDemo.Web")))
.UseEnvironment("Development")
.UseStartup<Startup>());
_client = _server.CreateClient();
}
[Fact]
public async Task DefaultPageExists()
{
var response = await _client.GetAsync("/");
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
Assert.True(!string.IsNullOrEmpty(responseString));
}
}
这里的关键点是.UseContentRoot(Path.GetFullPath(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "..", "..", "..", "..", "..", "SaaSDemo.Web")))
ApplicationBasePath位于测试程序集bin/debug/{platform version}/{os-buildarchitecture}/文件夹中。您需要向上遍历该树,直到到达包含您的视图的项目。就我而言。SaasDemo.Tests
和SaasDemo.Web
在同一个文件夹中,因此向上遍历5个文件夹是合适的数量。
为了将来参考,请注意,您现在可以像这样设置内容根:
string contentRoot = "path/to/your/web/project";
IWebHostBuilder hostBuilder = new WebHostBuilder()
.UseContentRoot(contentRoot)
.UseStartup<Startup>();
_server = new TestServer(hostBuilder);
_client = _server.CreateClient();
为了让重写的启动类工作,我还需要做一个额外的更改,那就是将IHostingEnvironment对象中的ApplicationName设置为web项目的实际名称(web程序集的名称)。
public TestStartup(IHostingEnvironment env) : base(env)
{
env.ApplicationName = "Demo.Web";
}
当TestStartup在不同的程序集中并重写原始Startup类时,这是必需的。在我的情况下,UseContentRoot仍然是必需的。
如果没有设置名称,我总是找不到404。