在单独的程序集中放置 asp.net 5 个测试
placing asp.net 5 tests in separate assembly
我使用 Microsoft.AspNet.TestHost 来托管 xunit 集成测试。只要测试与 asp.net-5-solution 在同一个项目中,一切都可以正常工作。
但我想将测试放入一个单独的程序集中,以将它们与解决方案分开。但是当我尝试 运行 单独解决方案中的测试时出现错误,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 正在相对于本地目录查找视图。我怎样才能让它在正确的项目路径中查找?
我这里有一个示例存储库 - https://github.com/mattridgway/ASPNET5-MVC6-Integration-Tests 显示了修复(感谢 David Fowler)。
TL;DR - 设置 TestServer 时,您需要设置应用程序基路径以查看其他项目,以便它可以找到视图。
为了将来参考,请注意您现在可以像这样设置内容根目录:
string contentRoot = "path/to/your/web/project";
IWebHostBuilder hostBuilder = new WebHostBuilder()
.UseContentRoot(contentRoot)
.UseStartup<Startup>();
_server = new TestServer(hostBuilder);
_client = _server.CreateClient();
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 个文件夹是正确的数量。
为了使覆盖的启动 class 正常工作,我必须做的另一项更改是将 IHostingEnvironment 对象中的 ApplicationName 设置为 Web 项目的实际名称(Web 程序集的名称) .
public TestStartup(IHostingEnvironment env) : base(env)
{
env.ApplicationName = "Demo.Web";
}
当 TestStartup 位于不同的程序集中并覆盖原始 Startup class 时,这是必需的。在我的情况下仍然需要 UseContentRoot。
如果没有设置名称,我总是得到 404 未找到。
我使用 Microsoft.AspNet.TestHost 来托管 xunit 集成测试。只要测试与 asp.net-5-solution 在同一个项目中,一切都可以正常工作。
但我想将测试放入一个单独的程序集中,以将它们与解决方案分开。但是当我尝试 运行 单独解决方案中的测试时出现错误,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 正在相对于本地目录查找视图。我怎样才能让它在正确的项目路径中查找?
我这里有一个示例存储库 - https://github.com/mattridgway/ASPNET5-MVC6-Integration-Tests 显示了修复(感谢 David Fowler)。
TL;DR - 设置 TestServer 时,您需要设置应用程序基路径以查看其他项目,以便它可以找到视图。
为了将来参考,请注意您现在可以像这样设置内容根目录:
string contentRoot = "path/to/your/web/project";
IWebHostBuilder hostBuilder = new WebHostBuilder()
.UseContentRoot(contentRoot)
.UseStartup<Startup>();
_server = new TestServer(hostBuilder);
_client = _server.CreateClient();
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 个文件夹是正确的数量。
为了使覆盖的启动 class 正常工作,我必须做的另一项更改是将 IHostingEnvironment 对象中的 ApplicationName 设置为 Web 项目的实际名称(Web 程序集的名称) .
public TestStartup(IHostingEnvironment env) : base(env)
{
env.ApplicationName = "Demo.Web";
}
当 TestStartup 位于不同的程序集中并覆盖原始 Startup class 时,这是必需的。在我的情况下仍然需要 UseContentRoot。
如果没有设置名称,我总是得到 404 未找到。