Asp .Net Core 3.0 добавление пользовательского класса Startup в тестах приводит к тому, что представления больше не обслуживаются - PullRequest
0 голосов
/ 09 ноября 2019

Я тестирую приложение Asp .Net Core 3.0 MVC. Это базовый пример приложения с помощью команды dotnet new mvc. В тестовом проекте xunit я тестирую возвращение представления Index из HomeController. Тест выглядит следующим образом:

public class HomeControllerTests
{
    [Fact]
    public async Task ReturnsView()
    {
        const string testProjectDir = "ViewsTestingTests";
        var factory = new TestServerFactory();
        var client = factory.WithWebHostBuilder(builder =>
        {
            builder.UseSolutionRelativeContentRoot(testProjectDir);
            builder.ConfigureTestServices(services =>
            {
                services.AddControllersWithViews()
                    .AddApplicationPart(typeof(Startup).Assembly);
            });
        }).CreateClient();

        var resultIndex = await client.GetAsync("/");
        resultIndex.StatusCode.Should().Be(200);
        var content = await resultIndex.Content.ReadAsStringAsync();
        content.Should().Contain("Welcome");
    }
}

public class TestServerFactory : WebApplicationFactory<TestStartup>
{
    protected override IWebHostBuilder CreateWebHostBuilder()
    {
        return WebHost.CreateDefaultBuilder(null)
            .UseStartup<TestStartup>();
    }
}

public class TestStartup : Startup
{
    public TestStartup(IConfiguration configuration) : base(configuration)
    {
    }
}

Я использую класс запуска теста, потому что я буду переопределять некоторые методы. Когда я использую этот класс TestStartup, тест не проходит. По следующей причине:

The view 'Index' was not found. The following locations were searched:
/Views/Home/Index.cshtml
/Views/Shared/Index.cshtml

Но если я использую класс запуска из основного проекта следующим образом:

public class TestServerFactory : WebApplicationFactory<Startup>
{
    protected override IWebHostBuilder CreateWebHostBuilder()
    {
        return WebHost.CreateDefaultBuilder(null)
            .UseStartup<Startup>();
    }
}

И создаю клиент следующим образом:

var client = factory.WithWebHostBuilder(builder =>
            {
                builder.UseSolutionRelativeContentRoot(testProjectDir);
            }).CreateClient();

Тогда тест пройден. Конечно, я скопировал всю папку Views в тестовый проект.

Структура решения. Представления находятся в тестовом проекте

Чем интересен тот же тест, который использовался для работы в Asp. Net Core 2.2. Использование builder.UseContentRoot внутри factory.WithWebHostBuilder и установка пути к папке с тестовым проектом не помогают. Пожалуйста, помогите мне, как подойти к этой проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...