2016-03-10 156 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。

有人可以給我一種方法,使用XUnit在我的測試類中獲得ProductRepository的實例嗎?我相信我正確啓動了一個測試服務器,因此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上?

讓我知道它是否有幫助。

更新 GitHub的樣本:https://github.com/DannyvanderKraan/ASPNETCoreAndXUnit

+0

丹尼,如果你可以上傳一個例子,github上,這將是真棒。我不得不承認,我仍然有點困惑。假設我有一個IProductRepo和一個ProductRepo:你能給我一個使用DI獲得ProductRepo實例的正確方法的例子,這樣我就可以在我的測試類中使用它了嗎? –

+0

布萊克,我已經更新了我的答案。你會做的是,而不是IPrimeService,你會寫IProductRepo而不是NegativePrimeService,你會寫ProductRepo。現在希望它清楚。 –