2009-11-08 8 views
5

Bon, alors j'ai essayé d'entrer dans IoC ces derniers temps. Cependant, je continue à courir dans un obstacle - c'est le fait que j'aime utiliser des objets simulés.Meilleures pratiques pour les tests unitaires, les objets factices et ioc

Ils sont rapides et faciles à installer. Cependant, si j'utilise IoC partout dans mon code, cela m'oblige à créer des implémentations de test (et des configurations) de mes objets au lieu d'utiliser des objets simulés (ie en utilisant moq).

Le résultat final est que je me retrouve avec d'énormes fichiers de configuration pour les tests.

En outre, il existe de nombreux scénarios dans les tests où j'ai besoin de différents comportements de mes classes sur une base test-à-test. Avec les objets moq, c'est extrêmement facile. Comment feriez-vous quelque chose de similaire avec IoC?

Toute aide serait très apprécié.

Merci,
Mike

+0

Pouvez-vous donner plus d'informations sur le problème? Je ne comprends pas comment ou pourquoi vous avez un problème. Peut-être un échantillon de code? –

+0

Si vous utilisez l'injection, les dépendances de votre classe doivent généralement être injectées dans le constructeur ou les propriétés. Dans votre test, vous devez donc avoir toutes les coutures nécessaires pour remplacer ce qui est injecté par les mock. Pouvez-vous élaborer sur un cas précis avec lequel vous vous battez? – Mathias

+0

Pourquoi diable utilisez-vous un conteneur IOC pour les tests unitaires? – mwjackson

Répondre

5

IoC devrait utiliser des objets simulacres plus facile, pas plus dur.

Plusieurs frameworks IoC Container vous permettront de définir des objets préexistants à injecter; Avec Moq, vous devez simplement configurer myMockObject.Object.

EDIT: Exemple de configuration Unity avec une maquette:

var mockService = new Mock<IMyService>(); 
container.RegisterInstance<IMyService>(mockService.Object); 

Comme alternative, vous pouvez simplement passer l'objet fantaisie dans le constructeur de la classe sous test (pour injection constructeur) et contourner le conteneur IoC entièrement dans vos tests unitaires.

EDIT: La réponse de Josh est un bon exemple de l'alternative. J'irais généralement avec sa solution plutôt que de reconfigurer le conteneur.

+0

Nice montrant comment utiliser l'IoC pour tester. Nous avons fini par devoir rouler notre propre IoC pour l'utiliser avec WCSF hors d'un contexte de Web. C'était étonnamment facile à faire et a fini par être un excellent exercice pour comprendre les modèles d'injection de dépendance et d'IoC. – Josh

3

J'adore IoC, et je me aime des objets Mock ...

Il n'y a pas de conflit avec ces deux. Si vous faites n'importe quel type d'injection de dépendance alors vous devriez simplement créer des objets simulés en utilisant votre cadre de simulation préféré et ensuite les transmettre dans votre SUT.

[Test] 
public void AnAwesomeTest() 
{ 
    IDependencyOne d1 = MyMocker.Create<IDependencyOne>(); 
    IDependencyTwo d2 = MyMocker.Create<IDependencyTwo>(); 

    //Constructor injection 
    SUT sut = new SUT(d1); 

    //Property Injection 
    sut.DependantProperty = d2; 

    //Do some stuff and Assert 
} 
+0

+1. Notez que ce serait "new SUT (d1.Object)" avec Moq. – TrueWill

+0

Intéressant. Je suis moi-même habitué à RhinoMocks ... si la syntaxe ne le laisse pas de côté. – Josh

+0

@Josh: Une différence est que d1 et d2 seraient de type Mock . L'inconvénient est d'avoir à faire .Objet de se rendre à l'interface, à l'envers est de pouvoir définir les attentes sur d1 et d2 directement. Cela vaut la peine de comparer/contraster les bibliothèques; ils ont des philosophies différentes. Je suis passé de Rhino à Moq il y a quelque temps. – TrueWill