2010-06-10 8 views
3

J'essaie d'utiliser Castle Windsor avec MS Test. La classe de test semble seulement utiliser le constructeur par défaut. Comment configurer Castle pour résoudre le service dans le constructeur?Comment passer la dépendance à l'objet avec Castle Windsor et MS Test?

Voici les constructeurs de la classe de test:

private readonly IWebBrowser _browser; 

     public DepressionSummaryTests() 
     { 

     } 

     public DepressionSummaryTests(IWebBrowser browser) 
     { 
      _browser = browser; 
     } 

Mon composant dans la configuration de l'application ressemble à ceci:

<castle> 
    <components> 
     <component id="browser" 
       service="ConversationSummary.IWebBrowser, ConversationSummary" 
       type="ConversationSummary.Browser" />  

    </components> 
    </castle> 

Voici mon conteneur d'application:

public class ApplicationContainer : WindsorContainer 
    { 
     private static IWindsorContainer container; 

     static ApplicationContainer() 
     { 
      container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle"))); 
     } 
     private static IWindsorContainer Container 
     { 
      get { return container; } 
     } 

     public static IWebBrowser Browser 
     { 
      get { return (IWebBrowser) Container.Resolve("browser"); } 
     } 
    } 

MS test nécessite le constructeur par défaut. Qu'est-ce que je rate?

Merci!

Répondre

1

Depuis MSTest nécessite le constructeur par défaut, cela signifie aussi qu'il ne utilise ce constructeur. Ainsi, vous ne pouvez jamais l'utiliser pour utiliser le constructeur surchargé. Ce n'est pas un problème avec Castle Windsor, mais juste comme fonctionne MSTest.

Ce n'est pas un gros problème, car vous avez shouldn't need to use a container for unit testing de toute façon.

Lorsque vous utilisez Windsor, vous pouvez utiliser le Fluent Registration API instead of XML.

Une autre chose est que vous ne devez pas utiliser un localisateur de service statique - it's an anti-pattern. Cela signifie que la classe ApplicationContainer est redondante et doit être supprimée.

+0

100% d'accord. Exiger un conteneur DI dans votre unité teste dans oxymoron comme vous devez être capable d'instancier et de se moquer des classes individuelles. –

+0

Je suis d'accord généralement. Mais dans ce cas, le service est un objet de navigateur utilisé pour le test de l'interface utilisateur. Ce couplage est inévitable. – Nick