2010-05-01 4 views
2

Je suis en train de se moquer d'une résolution Autofac, commeméthode d'extension "Resolve" de Mocking Autofac avec Typemock

using System; 
using Autofac; 
using TypeMock.ArrangeActAssert; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var inst = Isolate.Fake.Instance<IContainer>(); 
     Isolate.Fake.StaticMethods(typeof(ResolutionExtensions), Members.ReturnNulls); 
     Isolate.WhenCalled(() => inst.Resolve<IRubber>()).WillReturn(new BubbleGum()); 
     Console.Out.WriteLine(inst.Resolve<IRubber>()); 
    } 
} 

public interface IRubber 
{} 

public class BubbleGum : IRubber 
{} 

En venant de Moq, la syntaxe et les exceptions de Typemock me confondez beaucoup. Ayant initialement exécuté ceci dans un TestMethod, j'ai continué à obtenir une exception ressemblant à "WhenCalled ne peut pas être exécuté sans un comportement complémentaire". J'ai essayé de définir des comportements pour tout le monde et leurs mères, mais en vain.

Ensuite, j'ai débogué a traversé le cycle de test, et j'ai vu qu'une exception réelle a été déclenchée depuis Autofac: IRubber n'a pas été enregistré.

Il est donc évident que la fonction Resolve statique n'est pas faussée, et je ne peux pas la faire truquer, peu importe comment je vais l'accrocher.

Isolate.WhenCalled(() => ResolutionExtensions.Resolve<IRubber>(null)).WillReturn(new BubbleGum()); 

... jette une exception Autofac plaint que le IComponentContext ne peut être nulle. Le nourrir IContainer vraisemblablement truqué (ou truquer un IComponentContext à la place) me renvoie à l'erreur "IRubber non enregistré".

Répondre

2

Cela pourrait être l'un de ces cas de nage à contre-courant - la quantité de code requise pour créer un «vrai» conteneur, avec la dépendance appropriée enregistrée, est moindre ou similaire à celle de TypeMock. Je suggérerais d'aller dans cette direction. Au lieu de faire dépendre le composant cible de IContainer, vous pouvez utiliser des 'Types de relations' comme Func, qui sont implicitement supportés par Autofac et plus expressifs, en plus d'être facilement simulables. http://nblumhardt.com/2010/01/the-relationship-zoo/ a plus d'informations sur cette approche, comme le fait http://code.google.com/p/autofac/wiki/DelegateFactories.

+0

Comment vous moqueriez Possédé cependant? –

+0

Il est généralement possible de traiter 'Owned ' comme s'il s'agissait d'un type de base comme' List 'ou' string' - construire des valeurs de 'Owned ' en utilisant son constructeur quand vous en avez besoin, en passant éventuellement un simulacre ' T' instance. J'espère que cela t'aides. –

+0

Pour le paramètre lifeTime ctor de la classe appartenant, est-il bien de passer dans un simulacre d'IDisposable? Qu'est-ce qui devrait vraiment être passé en tant que param? Merci! –

Questions connexes