0

単体テストでテストデータ初期化子を使用し、本番環境で実際のデータ初期化子を使用できるように、データベース初期化子を挿入しようとしています。

これが私のninjectモジュールです。

class IocBindings : NinjectModule
{
    public override void Load()
    {
        Bind<DbContext>()
            .To<ActualEntityFrameworkDataContext>();

        Bind(typeof(IDatabaseInitializer<>))
            .To(typeof(TestDataContextInitializer));

    }
}

ご覧のとおり、定義されているバインディングは 1 つだけです。ただし、テストを実行すると、次の例外が発生して失敗します。

Ninject.ActivationException : Error activating IDatabaseInitializer{TContext} More than one matching bindings are available.

カーネルをインスタンス化し、それを共通サービスロケーターに渡すベーステストフィクスチャがあります。

[TestFixture]
public class TestContext
{
    private IKernel NinjectKernel { get; set; }

    [SetUp]
    public void setup()
    {
        NinjectKernel = new StandardKernel(new INinjectModule[] { new IocBindings() } );
        ServiceLocator.SetLocatorProvider(() => new NinjectServiceLocator(NinjectKernel));
    }

    [TearDown]
    public void TearDownAttribute()
    {
        NinjectKernel.Dispose();
    }
}

私はninjectを初めて使用するので、正しく設定したかどうかわかりません。

この問題を解決する方法についてのヘルプは大歓迎です。

乾杯

4

1 に答える 1

1

ソース コードの何が問題なのかわかりませんが、次のコード行を使用すると、例外は発生しません。明らかに、これが唯一の回避策です。

Bind<DbContext>()
            .To<ActualEntityFrameworkDataContext>()
            .OnActivation(dbContext => (new TestDataContextInitializer()).InitializeDatabase(dbContext as ActualEntityFrameworkDataContext));
于 2011-04-15T21:33:21.923 に答える