9

次のエラーが表示されます。

Test method: BootStrapperTest.Can_Create_Alert_Management_Object threw exception:  Ninject.ActivationException: 
Error activating IAlertManagement No matching bindings are available, and the type is not self-bindable. 

Activation path:   
1) Request for IAlertManagement

Suggestions:    
1) Ensure that you have defined a binding for IAlertManagement.    
2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.    
3) Ensure you have not accidentally created more than one kernel.    
4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.    
5) If you are using automatic module loading, ensure the search path and filters are correct.

この例外の原因となっているテスト ケースは次のとおりです。

[TestInitialize]
public void Initialize()
{
    BootStrapper.RegisterTypes();
}

[TestMethod]
public void Can_Create_Alert_Management_Object()
{
    IAlertManagement alertManagementService = BootStrapper.Kernel.Get<IAlertManagement>();

    Assert.IsNotNull(alertManagementService);
}

//This is the code that gets called in [TestInitialize]
public static void RegisterTypes()
{
    if (!initialized)
    {
        Kernel.Bind(scanner => scanner.FromAssembliesMatching("MyCompany.MyProduct.*")
                                   .SelectAllClasses()
                                   .BindDefaultInterface());

        Kernel.Unbind(typeof(IWcfServiceClient<>));
        Kernel.Bind(typeof(IWcfServiceClient<>)).ToMethod(ctx =>
                    (ctx.Kernel.Get(typeof(WcfServiceClientProvider<>).MakeGenericType(ctx.GenericArguments)) as IProvider).Create(ctx)); 
    }

    initialized = true;
}

上記のエラーは、ビルド サーバーのユニット テストの 1 つで発生していますが、開発マシンでは発生していません。このテストとほぼ同じテストが他に 7 つあり、ビルド サーバーと開発マシンで成功しましたが、失敗したテストはこれだけです。

IAlertManagement インターフェイスはCoreという dll から来ており、具象型はAlertManagementという別の dll から来ています。Core dll とAlertManagement dll の両方を単体テストプロジェクトにプロジェクト参照として含めています。この状況と同じテストを他に 7 つか 8 つ持っていますが、失敗したのはこれだけです。

どんなアイデアでも大歓迎です。

4

3 に答える 3

1

IAlertManagement具象クラスにバインドされていないため、エラーが発生します。手動でバインドしてみてくださいIAlertManagement

public static void RegisterTypes()
{
    if (!initialized)
    {
        Kernel.Bind(scanner => scanner.FromAssembliesMatching("MyCompany.MyProduct.*")
                               .SelectAllClasses()
                               .BindDefaultInterface());


        //Try to add following line
        Kernel.Bind<IAlertManagement>().To<ConcreteImplementationOfIAlertManagement>();

        Kernel.Unbind(typeof(IWcfServiceClient<>));
        Kernel.Bind(typeof(IWcfServiceClient<>)).ToMethod(ctx => (ctx.Kernel.Get(typeof(WcfServiceClientProvider<>).MakeGenericType(ctx.GenericArguments)) as IProvider).Create(ctx)); 
    }

    initialized = true;
}
于 2012-09-20T05:41:25.160 に答える
1

単体テストプロジェクトで解決型への具体的な参照を追加することで、これを解決しました。プロジェクト参照を追加するだけでは不十分です。これは私がこれをやっている方法です:

[TestClass]
public class AssemblyInitialize
{
    /// <summary>
    /// Method which gets executed once per unit test session. The purpose of this method is to reference any loosely coupled
    /// assemblies so that they get included in the unit test session. If no code actually references a given assembly, even if its
    /// technically a project reference, it will not be copied to the test output folder.
    /// </summary>
    [AssemblyInitialize]
    public static void InitializeReferencedAssemblies(TestContext context)
    {
        List<Type> looselyCoupledTypes = new List<Type>
                                         {
                                             typeof(AlertManagement),
                                             typeof(Naming),
                                         };

        looselyCoupledTypes.ForEach(x => Console.WriteLine("Including loosely coupled assembly: {0}",
                                                           x.Assembly.FullName));
    }
}
于 2016-01-29T22:13:15.110 に答える
0
  1. 最初に確認することは、の実装を含む DLL がIAlertManagementビルド サーバー上の適切なディレクトリにコピーされ、テストで認識されるようにすることです。

  2. もう 1 つの試してみるべきことは、カーネル ロード コードをClassInitializeではなく関数に移動してTestInitialize、ある種の競合状態またはその他の関連するものがあるかどうかを確認することです。オブジェクトが通常とは異なる順序で、または通常よりも早く破棄されるため、ビルド サーバーでランダム エラーが発生することがあります (私の場合は、Rx、TPL、および観察されない例外が関係しています)。デスクトップよりもビルド サーバーでより多くのテストが並行して実行される可能性があります。

  3. または、サーバーがServer GCを使用している可能性があるという事実が部分的に原因である可能性があります。Workstation GC を強制的に使用することが役立つかどうかはわかりませんが、試してみる価値はあります。

于 2012-09-18T20:14:02.437 に答える