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の方法を見つけたいですか)
各テストで、ICustomDbContext.csとIUnitOfWork.csは、CustomDbContext.csの同じインスタンスを指す必要があります。はい、あなたは正しいです。私はすべてのテストで正しく初期化されています(これは正しくなく、私はOneTimeSetUpで移動します)が、問題は異なります。 – chunk1ty
問題の各テストは、同じ '[TestFixture]'の一部である必要がありますそれが働くために。 AFAIK、NUnitにはMVCのような "アプリケーション全体"というコンセプトはありません。通常は[コンポジションルート](http://blog.ploeh.dk/2011/07/28/CompositionRoot/)を置く場所です。 – NightOwl888
同じファイルにあります。正直言って、私は何とか2日前にそれを設定するが、私はそれらの変更を破棄し、私はそれをやったのを覚えていない。私はChildKernelを使用していて、登録は上記のものと似ていることを思い出しました。 – chunk1ty