Ошибка неразрешенных аргументов конструктора при попытке использовать внедрение зависимостей с 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)
    {

    }
}

Я получаю следующую ошибку:

Message: System.AggregateException : One or more errors occurred. ---- Class fixture type 'MyProj.Tests.TestFixture' had one or more unresolved constructor arguments: IConfiguration configuration ---- The following constructor parameters did not have matching fixture data: TestFixture fixture

Очевидно, это технически возможно, но крайне маловероятно; люди из xUnit сделали множество заявлений о том, что нет никакого плана или желания делать общий DI как здесь, так и по вопросам Github.

Ruben Bartelink 18.04.2018 03:25

@RubenBartelink Вам кажется странным, что он как-то работал раньше и не работает сейчас из-за последней версии XUnit или .NET Core 2.0?

Blake Rivell 18.04.2018 16:13

Определенно есть что-то странное, но я не могу придумать никаких причин полагать, что был какой-то момент времени, когда xUnit создавал что-то, кроме того, что продиктовано явным использованием IClassFixture и / или CollectionAttribute. Единственное, что приходит мне в голову, это конструкторы по умолчанию, скрывающие зависимости и / или тестовые классы, которые являются частными и т. д., Но предположим, что что-то сработало для вас, поэтому это должно быть что-то еще

Ruben Bartelink 19.04.2018 13:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
3
2 308
1

Ответы 1

Интересно, почему у меня был такой код, как вы, поскольку в документации (https://xunit.github.io/docs/shared-context) ничего не говорится об использовании DI в Fixtures ... В моем случае я решил это, удалив 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();
    }

как думаешь, сможешь ответить на этот вопрос? Спасибо stackoverflow.com/questions/57331395/…

user11712184 04.08.2019 20:41

Связанный пост от @ Tom85Morris очень интересен!

barbara.post 06.08.2019 10:32

Другие вопросы по теме