自分のプロジェクトの1つにビジネスロジックコンポーネントをユニットテストしたいと思います。単体テストでEntity Frameworkコンテキストを模擬するか代替するか?
BL:
public class CommunicationService
{
IContext context;
public CommunicationService()
{
var kernel = new StandardKernel(new NinjectConfig());
context = kernel.Get<IContext>();
}
// This creates a file
public void SomeMethodThatUsesIContext() { ... }
}
NinjectConfig:
class NinjectConfig : NinjectModule
{
public override void Load()
{
Bind<IContext>().To<CommunicationDbContext>();
}
}
ユニットテスト:
class FakeNinjectConfig : NinjectModule
{
public override void Load()
{
Bind<IContext>().To<FakeDbContext>();
}
}
:
[TestMethod]
public void ScheduleTransportOrder_1()
{
communicationService = new CommunicationService();
communicationService.SomeMethodThatUsesIContext();
Assert.IsTrue(...) // file should be created.
}
私はユニットテストのプロジェクト内の別のNinjectの設定を持っています
そして、私はIContextのこの実装を単体テストで使用します。しかし、それはやはり元のCommunicationDbContext実装を使用しています。私は、ここにもう1つのninject設定があると、それがカーネルにロードされると信じていましたが、今私は何か誤解していました。あなたはそれを手伝ってもらえますか?
問題は本当にあなたがやっているという事実に由来 '新しいStandardKernel(新NinjectConfig())
IContext
を注入することができます'あなたの' CommunicationService'コンストラクタで。あなたのロジックが分かりませんが、実際には、現在のコードで 'CommunicationService'に偽の' IContext'を提供することはできません。私はコンストラクタインジェクションをNinjectを使って見て、 'IContext'を' CommunicationService'に自動的に注入すると、あなたのテストで虚偽のインスタンスを提供することができます。 –