2016-03-10 6 views
6

私はXUnitで依存性注入をどのように使用できるかを調べようとしています。私の目標は、私のProductRepositoryを私のテストクラスに注入することです。 次のコンストラクタのパラメータは、フィクスチャデータをマッチング(ICustomerRepositoryリポジトリ)を持っていなかった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; 
    } 
} 

がエラーである:ここでは

は、私がしようとしているコードです。それがFixtureである場合に限り、XUnitは依存性注入をサポートしません。

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を記述します。今はっきりしたいと思っています。 –