Неразрешенная ошибка аргументов конструктора при попытке использовать внедрение зависимости с 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();
    }
Другие вопросы по тегам