2016-03-10 85 views
6

Sto cercando di capire come utilizzare l'integrazione delle dipendenze con XUnit. Il mio obiettivo è essere in grado di iniettare il mio ProductRepository nella mia classe di test.Iniezione delle dipendenze con XUnit e ASP.NET Core 1.0

Ecco il codice che sto cercando:

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; 
    } 
} 

Ecco l'errore: I seguenti parametri del costruttore non avevano corrispondenti dati fixture (repository ICustomerRepository)

Questo mi porta a credere che XUnit non supporta l'iniezione di dipendenza, solo se è un dispositivo.

Qualcuno può darmi un modo per ottenere un'istanza di ProductRepository nella mia classe di test utilizzando XUnit? Credo di aver avviato correttamente un server di test in modo che Startup.cs funzioni e configura il DI.

risposta

7

Bene, non penso sia possibile accedere al contenitore del SUT. E ad essere onesti, non capisco esattamente perché tu voglia. Avrai il controllo completo del tuo SUT. Ciò significa che vuoi fornire le tue dipendenze da iniettare.

E questo, è possibile!

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

Il CreateBuilder prevede sovraccarichi per questo. Dovrai fornire configurazioni e configurazioni di app per gli stessi motivi (il motivo è che vuoi il controllo completo sul tuo SUT). Ho seguito l'articolo this per rendere l'esempio sopra se sei interessato. Potrei anche caricare l'esempio sul mio GitHub, se lo desideri?

Fammi sapere se ha aiutato.

Aggiornamento GitHub campione: https://github.com/DannyvanderKraan/ASPNETCoreAndXUnit

+0

Danny se è possibile caricare un esempio per GitHub che sarebbe impressionante. Devo ammettere che sono ancora un po 'confuso. Diciamo che ho un IProductRepo e un ProductRepo: puoi darmi un esempio del modo corretto per ottenere un'istanza di ProductRepo usando DI così posso usarlo nella mia classe di test? –

+0

Blake, ho aggiornato la mia risposta. Quello che dovresti fare è, invece di IPrimeService, scrivere IProductRepo e invece di NegativePrimeService, dovresti scrivere ProductRepo. Spero che sia chiaro ora. –

Problemi correlati