0

Je rencontre des difficultés pour tester une fabrique de contrôleurs Unity. Je suis en train de cerner le conteneur de l'unité et d'affirmer qu'une méthode a été appelée. Je reçois une erreur de distribution invalide mais je ne peux pas vraiment voir ce qui ne va pas avec mon code.Problèmes de dérision IUnityContainer lors du test de UnityControllerFactory dans le projet MVC

Voici la classe en cours de test:

public class UnityControllerFactory : IControllerFactory 
    { 
     private readonly IUnityContainer _container; 

     public UnityControllerFactory(IUnityContainer container) 
     { 
      if (container == null) 
      { 
       throw new ArgumentNullException("container"); 
      } 

      _container = container; 
     } 

     public IController CreateController(RequestContext requestContext, string controllerName) 
     { 
      return _container.Resolve<IController>(controllerName); 
     } 

     public void ReleaseController(IController controller) 
     { 
      _container.Teardown(controller); 
     }   
    } 

et voici le test:

[Test] 
     public void CreateControllerCallsResolveOnContainerWithCorrectArgument() 
     { 
      const string controllerName = "WhateverController"; 

      var containerMock = MockRepository.GenerateMock<IUnityContainer>(); 

      var controllerFactory = new UnityControllerFactory(containerMock); 

      controllerFactory.CreateController(null, controllerName); 

      containerMock.AssertWasCalled(x => x.Resolve<IController>(controllerName)); 
     } 

et voici le message d'erreur:

System.InvalidCastException: Impossible de jeter l'objet de type 'ObjectProxy42336d85f7bb400f9590892348d1d597' pour taper 'System.Web.Mvc.IController'

+0

Sur quelle ligne obtenez-vous cette exception? Quand j'ai testé votre code, ça a bien marché pour moi. –

+0

Sur la dernière ligne (AssertWasCalled). Hmm. Peut-être la version de Rhino Mocks? J'utilise 3.6 (et Unity 2.0) –

Répondre

2

La méthode générique Resolve<T>(string) est une méthode d'extension qui ne peut pas être modifiée. Vous avez deux choix ici:

  1. Utilisez une méthode Resolve(Type, string) non générique ou
  2. Wrap IUnityContainer avec votre propre interface afin que les méthodes génériques que vous souhaitez utiliser des méthodes d'interface, pas des méthodes d'extension.
+0

Aha. Ceci explique cela. Merci. –

+0

Ah, c'est une méthode d'extension. – Carra

0

Pourquoi n'utilisez-vous pas simplement une implémentation réelle d'un IUnityContainer et enregistrez-vous des faux/stubs à l'intérieur?

+0

Un conteneur IoC n'a pas sa place dans un projet de test unitaire. Nous devrions tester la classe à tester en isolation. Je crois que toute config dans un projet de test unitaire est une mauvaise pratique. –

+1

De quelle config parlez-vous? C'est juste du code ... – Simone