2010-02-24 7 views
0

J'essaie de mettre en place des tests d'unité de lame dans un site dérivé de MVC Turbine. Le problème est que je ne peux pas sembler se moquer de l'interface IServiceLocator sans frapper l'exception suivante:Comment puis-je tester les lames dans MVC Turbine avec Rhino Mocks?

System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) 
at System.Reflection.Emit.TypeBuilder._TermCreateClass(Int32 handle, Module module) 
at System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() 
at System.Reflection.Emit.TypeBuilder.CreateType() 
at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType() 
at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType() 
at Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(Type proxyTargetType, Type[] interfaces, ProxyGenerationOptions options) 
at Castle.DynamicProxy.DefaultProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options) 
at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options) 
at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, IInterceptor[] interceptors) 
at Rhino.Mocks.MockRepository.MockInterface(CreateMockState mockStateFactory, Type type, Type[] extras) 
at Rhino.Mocks.MockRepository.CreateMockObject(Type type, CreateMockState factory, Type[] extras, Object[] argumentsForConstructor) 
at Rhino.Mocks.MockRepository.Stub(Type type, Object[] argumentsForConstructor) 
at Rhino.Mocks.MockRepository.<>c__DisplayClass1`1.<GenerateStub>b__0(MockRepository repo) 
at Rhino.Mocks.MockRepository.CreateMockInReplay<T>(Func`2 createMock) 
at Rhino.Mocks.MockRepository.GenerateStub<T>(Object[] argumentsForConstructor) 
at XXX.BladeTest.SetUp() 

Tout ce que je cherche au sujet de cette erreur me conduit à 32 bits contre 64 bits problèmes de compilation de DLL, mais MVC Turbine utilise la façade du localisateur de service partout et nous n'avons eu aucun autre problème, juste en utilisant Rhino Mocks pour tenter de le railler.

Il souffle sur la deuxième ligne de cette NUnit mis en place la méthode:

IRotorContext _context; 
IServiceLocator _locator; 

[SetUp] 
public void SetUp() 
{ 
    _context = MockRepository.GenerateStub<IRotorContext>(); 
    _locator = MockRepository.GenerateStub<IServiceLocator>(); 
    _context.Expect(x => x.ServiceLocator).Return(_locator); 
} 

Juste un côté rapide; J'ai essayé d'implémenter une fausse implémentation IServiceLocator, en pensant que je pouvais juste suivre les appels aux méthodes d'enregistrement de type. Cela ne fonctionnera pas dans notre configuration, car nous étendons l'interface du localisateur de service de telle sorte que si le type n'est pas basé sur Unity, la logique d'enregistrement n'est pas invoquée.

Répondre

1

Ceci a été corrigé en version bêta Moq v4.0. La question était dans le château . DynamicProxy 2.1 lors de la création proxies dynamiques pour les interfaces avec les contraintes génériques

http://code.google.com/p/moq/issues/detail?id=177

+0

+1 Intéressant ... Je ne me suis pas rendu compte que Castle était le cadre sous-jacent pour Moq et RhinoMocks jusqu'à ce que je regarde cela et relis ma trace de pile –

1

Oui, j'ai rencontré le même problème avec RhinoMocks tout en testant le moteur d'exécution pour Turbine. Je déteste le dire mais j'ai travaillé autour de la question en fournissant mon propre faux pour IServiceLocator pour où j'ai eu besoin, mais comme vous l'avez expliqué, vous ne pouvez pas faire cela. :(

Je ne vous suis pas ce morceau de votre question, « si le type est l'unité basée sur » ??

+0

Javier - merci pour le retour rapide, pour l'enregistrement, la turbine MVC est fantastique et je comprends comment il est facile SoC pour tous ceux qui travaillent sur notre site Nous avons étendu l'interface IServiceLocator pour accepter le gestionnaire de durée de vie objets. Comme ils sont spécifiques à Unity, l'appel s'exécute uniquement si l'objet sous-jacent est UnityServiceLocator. Nous avons ajouté une couche entre notre site et MVC Turbine qui définit et enregistre les éléments de haut niveau (par exemple, la journalisation, la gestion des cookies) dans son application HTTP globale. Nous avons donc estimé que les mappages de niveau inférieur devaient être définis dans les lames. Des pensées sur une meilleure façon? –

+0

Donc, après un refactoring intense, j'ai fait en sorte que nous puissions ajouter des enregistrements de type à un conteneur statique sur l'application web globale dans son constructeur statique. De cette façon, je ne dois pas faire mon piratage d'extension d'interface. –

+0

Désolé d'être MIA sur cette question mais je n'étais pas averti des ajouts. :) Combien de refactoring avez-vous dû faire? –