Я тестирую приложение 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
и установка пути к папке с тестовым проектом не помогают. Пожалуйста, помогите мне, как подойти к этой проблеме.