在单独的程序集中放置 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.TestsSaasDemo.Web 在同一个文件夹中,因此遍历 5 个文件夹是正确的数量。

为了使覆盖的启动 class 正常工作,我必须做的另一项更改是将 IHostingEnvironment 对象中的 ApplicationName 设置为 Web 项目的实际名称(Web 程序集的名称) .

public TestStartup(IHostingEnvironment env) : base(env)
        {
            env.ApplicationName = "Demo.Web";
        }

当 TestStartup 位于不同的程序集中并覆盖原始 Startup class 时,这是必需的。在我的情况下仍然需要 UseContentRoot。

如果没有设置名称,我总是得到 404 未找到。