2016-03-10 5 views
6

Я пытаюсь выяснить, как я могу использовать инъекцию зависимостей с помощью XUnit. Моя цель - уметь вводить мой ProductRepository в мой тестовый класс.Инъекция зависимостей с XUnit и ASP.NET Core 1.0

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

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.

ответ

7

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

И это, вы можете!

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

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

Дайте мне знать, если это поможет.

Update GitHub образец: https://github.com/DannyvanderKraan/ASPNETCoreAndXUnit

+0

Дэнни, если вы можете загрузить пример GitHub, который был бы удивительным. Я должен признать, что я все еще немного смущен. Допустим, у меня есть IProductRepo и ProductRepo: Можете ли вы привести пример надлежащего способа получить экземпляр ProductRepo с использованием DI, чтобы я мог использовать его в своем тестовом классе? –

+0

Блейк, я обновил свой ответ. Что бы вы сделали, а вместо IPrimeService, вы должны написать IProductRepo, а вместо NegativePrimeService, вы должны написать ProductRepo. Надеюсь, теперь это ясно. –

Смежные вопросы