首页 > 解决方案 > ASP.net 核心集成测试与继承的 Startup 类。找不到查看

问题描述

我正在尝试针对 aspnet core 2.2 编写一些集成测试。我想使用继承自普通 Startup 类的 TestStartup 类来配置资源和服务以进行测试。

一个简单的例子(可以在这里找到:https ://github.com/davidgouge/aspnet-integration-testing ):

我有一个包含两个项目的解决方案:

IntegrationTestingWeb(一个准系统 aspnet mvc 应用程序) IntegrationTestingTests(一个测试项目)

我有一个使用 Web Startup 类的测试,并断言 OK 是从/Home/Privacy

[Test]
public async Task GetPrivacy_Through_Normal_Startup()
{
    var builder = new WebHostBuilder().UseStartup<Startup>();
    var client = new TestServer(builder).CreateClient();
    var result = await client.GetAsync("/Home/Privacy");
    result.StatusCode.Should().Be(HttpStatusCode.OK);
}

该测试通过。

如果我创建了一个继承自 Startup 的 TestStartupInTestProject 类,但将其放在 Tests 项目中,那么在创建 WebHostBuilder 时我必须做一些额外的工作,但随后测试失败。

[Test]
    public async Task GetPrivacy_Through_Test_Startup_In_Test_Project()
    {
        var builder = new WebHostBuilder().ConfigureServices(services =>
        {
            var startupAssembly = typeof(TestStartupInTestProject).GetTypeInfo().Assembly;

            var manager = new ApplicationPartManager();
            manager.ApplicationParts.Add(new AssemblyPart(startupAssembly));
            manager.ApplicationParts.Add(new AssemblyPart(typeof(HomeController).Assembly));
            manager.FeatureProviders.Add(new ControllerFeatureProvider());
            manager.FeatureProviders.Add(new ViewComponentFeatureProvider());
            services.AddSingleton(manager);
        }).UseStartup<TestStartupInTestProject>();
        var client = new TestServer(builder).CreateClient();

        var result = await client.GetAsync("/Home/Privacy");

        result.StatusCode.Should().Be(HttpStatusCode.OK);
    }

失败的错误是:

Tests.Tests.GetPrivacy_Through_Test_Startup_In_Test_Project

System.InvalidOperationException : The view 'Privacy' was not found. The 
following locations were searched:
/Views/Home/Privacy.cshtml
/Views/Shared/Privacy.cshtml
/Pages/Shared/Privacy.cshtml

所以看起来因为我的 Startup 类位于 Test 项目中,所以无法找到视图。我缺少什么设置才能找到视图?

标签: unit-testingasp.net-coreintegration-testing

解决方案


事实证明我.UseContentRoot(Directory.GetCurrentDirectory() + "\\..\\..\\..\\..\\IntegrationTestingWeb")在创建 WebHostBuilder 时丢失了。听起来,它设置了应用程序将在其中查找视图等的根目录。


推荐阅读