#c# #asp.net-core #integration-testing #.net-5
Вопрос:
Я пытаюсь заставить некоторые тесты правильно выполняться в CI с помощью WebApplicationFactory
Эти тесты проходят локально, когда мы запускаем их в интегрированной среде разработки, но они завершаются неудачей с
System.InvalidOperationException: Solution root could not be located using application root
Когда мы запустим их в CI.
В CI у нас есть каталог с именем integration_tests
, который содержит несколько dll
файлов для тестов, и мы запускаем vstest
команду для тестирования этих библиотек DLL, но у нас там нет .sln
файла.
Наше веб-приложение Factory выглядит примерно так:
factory = new WebApplicationFactory<Startup>()
.WithWebHostBuilder(b =>
{
b.ConfigureTestServices(s => {});
});
client = factory.CreateDefaultClient();
Я пробовал использовать WebApplicationFactoryContentRoot
и помещать его внутрь AssemblyInfo.cs
, но я не уверен, что мы используем его правильно, и я не могу найти никаких примеров в документах, которые на самом деле используют его с существующими интеграционными тестами.
Я также попытался установить параметр b.UseSolutionRelativeContentRoot()
для WebHostBuilder, но, опять же, он работает только локально.
Как мы можем правильно использовать WebApplicationFactoryContentRoot
, чтобы разрешить WebApplicationFactory
работать не только локально, но и в CI для опубликованных библиотек DLL?
Ответ №1:
WebApplicationFactory
игнорирует установленный корневой путь пользовательского содержимого WithWebHostBuilder
, поэтому UseSolutionRelativeContentRoot
и UseContentRoot
не будет работать.
Существует несколько способов установить корневой каталог содержимого для тестового сервера:
- Используйте
WebApplicationFactoryContentRootAttribute
на сборке, содержащей интеграционные тесты с ключом, равным
TEntryPoint
сборкеSystem.Reflection.Assembly.FullName
и вам нужно убедиться, что файл маркера существует в каталоге.
Например, приведенный ниже код устанавливает корень содержимого в AppContext.BaseDirectory
:
// In your test assembly:
[assembly: WebApplicationFactoryContentRoot(
key: "WebApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
contentRootPath: "",
contentRootTest: "WebApplication1.dll",
priority: "-1000")]
- Скопируйте
sln
файл в каталог. - Установите
ASPNETCORE_TEST_CONTENTROOT_APPNAME
в соответствии с исходным кодом.