Неразрешенная ошибка аргументов конструктора при попытке использовать внедрение зависимости с XUnit
У каждого из моих тестовых проектов XUnit есть файл appsettings.json, в котором указаны несколько настроек. Я всегда использовал внедрение зависимостей в IConfiguration для получения этих настроек в своем классе Test Fixture. Теперь, когда я думаю об этом, я абсолютно не представляю, как IConfiguration была разрешена в прошлом, поскольку в проекте XUnit нет методов Startup.cs и ConfigureServices. Но я клянусь, это сработало.
Раньше работало, а теперь нет:
Крепеж:
public class TestFixture : IDisposable
{
public IConfiguration Configuration { get; set; }
public TestFixture(IConfiguration configuration)
{
Configuration = configuration;
}
}
Тестовый класс:
public class TestCases : IClassFixture<TestFixture>
{
public TestCases(TestFixture fixture)
{
}
}
Я получаю следующую ошибку:
Сообщение: System.AggregateException: произошла одна или несколько ошибок. ---- Тип приспособления класса 'MyProj.Tests.TestFixture' имел один или несколько неразрешенных аргументов конструктора: Конфигурация IConfiguration ---- Следующие параметры конструктора не имели совпадающих данных приспособления: FixFestture Fixture
2 ответа
Я знаю, что эта проблема очень старая, но, возможно, решение может быть кому-то полезно.
Я столкнулся с той же проблемой и исправил ее с помощью универсального класса WebApplicationFactory. Надеюсь, это решение для остальных.
заменять
: IClassFixture<TestFixture> ->
: IClassFixture<WebApplicationFactory<Startup>>
для более подробной информации вы можете посетить официальную страницу
Интересно, почему у меня был такой код, как вы, поскольку документация ( https://xunit.github.io/docs/shared-context) ничего не говорит об использовании DI в приборах... В моем случае я решил это, удалив DI потому что у меня была та же ошибка, что и у вас.
Тогда у меня есть такой код, чтобы иметь коллекцию сервисов для модульных тестов.
var services = new ServiceCollection();
ConfigureServices(services);
IServiceProvider serviceProvider = services.BuildServiceProvider();
// Assign shortcuts accessors to registered components
UserManager = serviceProvider.GetRequiredService<UserManager<User>>();
RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole<string>>>();
My ConfigureServices () вызывает этот код перед регистрацией служб в коллекции, поэтому это отвечает на ваш вопрос о IConfiguration. Обратите внимание, что сейчас я использую.net core 2.1, ранее был 2.0. Но мне все еще интересно, как вы и другие люди, которые прокомментировали, почему DI не падал раньше?
private static IConfiguration LoadConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
return builder.Build();
}