9
votes

NImject ActivationException: Erreur lors de l'activation d'ialertManagement

Je reçois l'erreur suivante:

[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;
}


0 commentaires

3 Réponses :


0
votes
  1. La première chose à vérifier est de vous assurer que la DLL contenant la mise en œuvre de ialertManagement est copiée dans le répertoire approprié sur le serveur de construction afin que les tests le voient.

  2. Une autre chose à essayer serait de déplacer le code de chargement du noyau sur un de classinitialiser à la place d'un testinitialiser , juste pour voir s'il y a une sorte de condition de race ou autre chose liée. J'ai vu des erreurs aléatoires sur les serveurs de construction dues aux objets disposés dans un ordre différent ou plus tôt que cela ne se produirait normalement (impliqué RX, TPL et des exceptions non observées dans mon cas). Il se peut que plus de tests soient exécutés en parallèle sur le serveur de construction que sur le bureau.

  3. ou cela pourrait être dû partiellement au fait que le serveur peut utiliser Server GC . Je ne sais pas si le forçant à utiliser Workstation GC aiderait ou non, mais cela vaut la peine d'essayer.


2 commentaires

Je vois la DLL contenant ialertManagement dans le dossier DROP du serveur de construction. J'ai également essayé de changer la classe de test de l'unité pour utiliser [classinitialize] au lieu de [testinitialize] mais il ne semblait pas aider. Je n'ai pas exploré l'option 3.


Juste pour tester, essayez de mettre l'alerte concrète dans un assemblage que vous connaissez est vu, comme le noyau. Il suffit d'ajouter un talon de la classe par exemple. Ensuite, vous sauriez si cela ne peut tout simplement pas trouver le fichier ou il y a autre chose.



1
votes

L'erreur se produit car ialertManagement n'est lié à aucune classe de béton. Essayez de lier manuellement ialertManagement . xxx


1 commentaires

Cela peut fonctionner mais c'est ce que je voulais m'éloigner de la première place. Je ne veux pas ajouter des références à toutes les DLL avec les classes concrètes.



1
votes

J'ai fini par résoudre ce problème en ajoutant des références concrètes aux types de résolution de mon projet de test de l'unité. Il suffit d'ajouter des références de projet ne suffit pas. C'est comme ça que je fais cela: xxx


0 commentaires