Внедрение зависимостей с помощью XUnit и ASP.NET Core 1.0

Я пытаюсь понять, как использовать инъекцию зависимостей с XUnit. Моя цель - внедрить свой ProductRepository в свой тестовый класс.

Вот код, который я пытаюсь:

public class DatabaseFixture : IDisposable
{
    private readonly TestServer _server;

    public DatabaseFixture()
    {
        _server = new TestServer(TestServer.CreateBuilder().UseStartup<Startup>());
    }

    public void Dispose()
    {
        // ... clean up test data from the database ...
    }
}

public class MyTests : IClassFixture<DatabaseFixture>
{
    DatabaseFixture _fixture;
    public ICustomerRepository _repository { get; set; }

    public MyTests(DatabaseFixture fixture, ICustomerRepository repository)
    {
        _fixture = fixture;
        _repository = repository;
    }
}

Вот ошибка: следующие параметры конструктора не имеют совпадающих данных фикстур (репозиторий ICustomerRepository)

Это заставляет меня думать, что XUnit не поддерживает внедрение зависимостей, только если это Fixture.

Может ли кто-нибудь дать мне способ получить экземпляр ProductRepository в моем тестовом классе с помощью XUnit? Я считаю, что правильно запускаю тестовый сервер, поэтому Startup.cs запускает и настраивает DI.


person Blake Rivell    schedule 10.03.2016    source источник


Ответы (1)


Что ж, я не думаю, что возможно получить доступ к контейнеру SUT. И, честно говоря, я не совсем понимаю, зачем вам это нужно. Вам понадобится полный контроль над вашей SUT. Это означает, что вы хотите предоставить свои собственные зависимости для внедрения.

И это можно!

_server = new TestServer(TestServer.CreateBuilder(null, app =>
{
    app.UsePrimeCheckerMiddleware();
},
services =>
{
    services.AddSingleton<IPrimeService, NegativePrimeService>();
    services.AddSingleton<IPrimeCheckerOptions, PrimeCheckerOptions>();
}));

CreateBuilder предоставляет для этого перегрузки. Вам нужно будет предоставить конфигурации и конфигурации приложений по тем же причинам (причина в том, что вам нужен полный контроль над вашей SUT). Я следил за этой статьей, чтобы сделать приведенный выше пример, если вам интересно . Я также могу загрузить образец на свой GitHub, если хотите?

Сообщите мне, помогло ли это.

Обновление образца GitHub: https://github.com/DannyvanderKraan/ASPNETCoreAndXUnit

person Danny van der Kraan    schedule 11.03.2016
comment
Дэнни, если бы вы могли загрузить пример на github, это было бы круто. Должен признать, что я все еще немного запутался. Допустим, у меня есть IProductRepo и ProductRepo: не могли бы вы дать мне пример правильного способа получить экземпляр ProductRepo с помощью DI, чтобы я мог использовать его в своем тестовом классе? - person Blake Rivell; 14.03.2016
comment
Блейк, я обновил свой ответ. Вместо IPrimeService вы должны написать IProductRepo, а вместо NegativePrimeService - ProductRepo. Надеюсь, теперь все ясно. - person Danny van der Kraan; 14.03.2016
comment
привет @DannyvanderKraan, можешь ответить на этот вопрос? Спасибо ! stackoverflow.com/questions/57331395/ - person ; 03.08.2019