2017-06-07 5 views
2

ASP.NET MVCベースのアプリケーションの統合テストを書いていますが、問題の登録問題を解決しようとしています。ninjectがnunitで異なるDbインスタンスを取得するのはなぜですか?

だから、私のASP.NET MVC登録に私はちょうどCustomDbContextがIUnitOfWorkとICustomDbContextを実装して明確にする

kernel.Bind(typeof(ICustomDbContext), typeof(IUnitOfWork)) 
       .ToMethod(ctx => ctx.Kernel.Get<CustomDbContext>()) 
       .InRequestScope(); 

を持っています。
この登録では、私はCustomDbContextのリクエストごとに1つの一意のインスタンスがあることを保証します。その登録はASP.NETの範囲内で適切に機能します。

問題は、統合テストを書くときです。

[SetUp] 
public void SetUp() 
{ 
    kernel = NinjectConfig.CreateKernel(); 
} 


[Test] 
public async Task Test() 
{ 
    // Arrange 
    var claaService = kernel.Get<IService>(); 

} 

では、私は(ASP.NET MVCプロジェクトである)私の組成ルートをロードするステップを設定します。


私はIService取得するときに問題がある(IService.csの実装がService.csであり、そのサービスはIUnitOfWork.csとIGenericRepository.csへの依存関係を持っている。IGenericRepository.csがICustomDbContextへの依存性を持ちます)。
私はIServiceにアクセスするときに、私はCustomDbContextの同じインスタンスを持っている必要があります(と私はMVCの範囲で動作すると言ったように)。
私は子スコープでそれを解決しようとしましたが、結果は(彼らはまだ別のハッシュコードを持っている)と同じである:

using (var childKernel1 = new ChildKernel(kernel)) 
{ 
    childKernel1.Rebind(typeof(ICustomDbContext), typeof(IUnitOfWork)) 
    .ToMethod(ctx => ctx.Kernel.Get<CustomDbContext>()) 
    .InThreadScope(); 

    var claaService = childKernel1.Get<IClassService>(); 

} 

私の質問は以下のとおりです。

  • これが起こっているのはなぜ?
  • どうすれば解決できますか(ninjectを使用しない場合は機能しますが、統合テストで追加の設定を追加する必要がある場合でもNinjectの方法を見つけたいですか)

答えて

1

これはなぜ起こっているのですか?

Ninjectのスコープは、コンテナの有効期間に制限されています。 [SetUp]を使用しているため、[テスト]ごとに、作成するコンテナをに設定しました。

この属性は、各試験方法が呼び出される直前に実行される機能の共通セットを提供するためにTestFixture内で使用されています。

[SetUp] 
public void SetUp() 
{ 
    kernel = NinjectConfig.CreateKernel(); 
} 

あなたが同じ[TestFixture]に複数のテストで同じコンテナを使用する場合

あなたは、(あなたが「インスタンスが同じではありません」と言ったので、これを想定していますが、何と同じでは言及しませんでした)代わりに[OneTimeSetup]を使用する必要があります。

この属性は一度前固定具に試験のいずれかを実行することに呼び出されるメソッドを識別することです。

[OneTimeSetUp] 
public void OneTimeSetUp() 
{ 
    kernel = NinjectConfig.CreateKernel(); 
} 

もちろんこれはあなたの関連する統合テストのすべてが単一のクラスである前提としています。

要するに、Ninjectコンテナがすべてのテストで再初期化されているため、管理するすべてのインスタンスも再初期化されています。

+0

各テストで、ICustomDbContext.csとIUnitOfWork.csは、CustomDbContext.csの同じインスタンスを指す必要があります。はい、あなたは正しいです。私はすべてのテストで正しく初期化されています(これは正しくなく、私はOneTimeSetUpで移動します)が、問題は異なります。 – chunk1ty

+0

問題の各テストは、同じ '[TestFixture]'の一部である必要がありますそれが働くために。 AFAIK、NUnitにはMVCのような "アプリケーション全体"というコンセプトはありません。通常は[コンポジションルート](http://blog.ploeh.dk/2011/07/28/CompositionRoot/)を置く場所です。 – NightOwl888

+0

同じファイルにあります。正直言って、私は何とか2日前にそれを設定するが、私はそれらの変更を破棄し、私はそれをやったのを覚えていない。私はChildKernelを使用していて、登録は上記のものと似ていることを思い出しました。 – chunk1ty

関連する問題