2016-01-28 2 views
1

Je suis actuellement en train d'augmenter la couverture de code sur nos produits logiciels et j'ai rencontré un problème; tous mes tests unitaires (lorsqu'ils sont compilés avec 'Any CPU') échouent en raison d'une erreur 'BadImageFormatException'.Tous les tests unitaires lançant BadImageFormatException avec Moq?

Cette exception peut être contournée en construisant la solution en utilisant 'x86' au lieu de 'Any CPU', mais les exigences sont telles que nous devons être capables de les exécuter en utilisant n'importe quel bit CPU/x64.

Tous les tests unitaires impliquant Moq suivent à peu près le même format:

[TestMethod] 
public void GetProduct_ValidId_ProductReturned() 
{ 
    //Setting up the object 
    Product prod = new Product(); 
    prod.ID = 7; 
    prod.Name = "Test"; 

    //Create the mocks 
    var mockProductRepo = new Mock<IRepository<Product>>(); 
    var testDb = new Mock<IUnitOfWork>(); 

    //Setup what the repo needs to return, in this case it's a Product 
    mockProductRepo.Setup(m => m.getByID(7)).Returns(prod); 

    //Setup what the database needs to return, in this case it's our repo which we've already setup 
    testDb.SetupGet(m => m.ProductRepo).Returns(mockProductRepo.Object); 

    //Run the test 
    Product returnedProd = ProductHelper.getProduct(testDb.Object, 7); 
    Assert.IsNotNull(returnedProd); 
} 

Je peux confirmer que ce test est réussi quand il est construit en utilisant x86. Est-ce que quelqu'un a des idées sur la façon dont je peux faire en sorte que Moq fonctionne bien lorsqu'il est construit avec 'Any CPU'? En outre, je peux également confirmer que tous mes projets dans la solution sont construits en utilisant la même valeur ('Any CPU'). J'utilise Moq v4.0.

EDIT: Voici la pleine exception: Méthode d'essai [ProductName et la méthode appelée] ont jeté exception: System.BadImageFormatException: Impossible de charger le fichier ou l'assembly « [Nom du produit], Version = 1.0.0.0, Culture = neutral , PublicKeyToken = null 'ou l'une de ses dépendances. Une tentative de chargement d'un programme avec un format incorrect a été effectuée.

+0

Etes-vous sûr que c'est Moq qui provoque l'exception? Pouvez-vous poster le texte intégral/callstack de l'exception? –

+0

C'est le coupable probable; tous les autres tests qui ne fonctionnent pas Moq fonctionnent sans problème – Novastorm

Répondre

4

Ok, donc après quelques recherches, j'ai finalement découvert quel était le problème. Même si vous sélectionnez 'Construire' puis 'Gestionnaire de configuration' dans la barre d'outils et que la plate-forme est définie sur 'Tout processeur' (comme c'était mon cas), je n'ai pas vérifié le Target Platform dans le projet .

Pour vérifier la plate-forme cible, vous devez effectuer les opérations suivantes:

  • Cliquez-droit sur votre projet et sélectionnez l'onglet «Propriétés de
  • Sélectionnez le « Build » sur les
  • gauche
  • Assurez-vous que la La cible de votre projet test correspond à celle du projet que vous testez

Dans mon cas, mon test visait 'Any CPU' mais mon projet en direct ciblait 'x64'. C'est ce qui causait le problème.

+0

Vous devriez accepter ceci comme réponse, peu importe que vous l'ayez résolu vous-même. – LukeW

+0

Je ferai de ceci la réponse acceptée une fois que le temps requis sera écoulé :) (il est dit que je ne peux pas accepter ma propre réponse pendant 2 jours de plus - peut-être parce que ma représentante est faible (?)) – Novastorm

1

Cela peut être dû à un projet ou à d'autres références d'assemblage manquantes. Essayez de vous assurer que vous avez des références de projets pour tous les projets de votre solution.

This post a un autre exemple.

+0

Je vais jeter un coup d'oeil à cela et voir si c'est le cas. J'ai mis à jour ma question avec l'exception exacte qui est levée – Novastorm