2009-02-11 7 views
0

Je dois tester une méthode appartenant à une classe de service. Cette classe de service a plusieurs dépendances dans le constructeur, certaines sont utilisées par cette méthode, d'autres non. Si nous ne devrions pas utiliser un conteneur DI pour nos tests unitaires, quelle est la meilleure façon d'instancier la classe de service?Instancier une classe à tester

var service = new ServiceClass(new Repository1(), new Repository2(), new ServiceClass2(), etc.); 

Ceci est difficile à lire et semble être beaucoup de code juste pour tester une méthode. Les choses deviennent vraiment désordonnées quand certaines de ces dépendances ont leurs propres dépendances.

+0

@tvanfosson: J'ai aimé ma version du titre mieux, en fait ;-) – mghie

+0

Je veux réparer, mais je suis sûr que le moment où j'essayer la même condition de course s'instaniate et gâcher la titre encore. –

+0

lol, tnx pour réparer cela, je me sens stupide – mxmissile

Répondre

2

Vous devriez vraiment envisager d'utiliser un cadre de simulation pour isoler votre test des objets dépendants réels. Je suppose que vous utilisez C# (du mot-clé var), donc je vais donner un exemple de RhinoMock.

var respository1 = MockRepository.GenerateMock<Repository1>(); 
repository1.Expect(r => r.SomeMethod()).Return(someValue); 

var repository2 = MockRepository.GenerateMock<Repository2>(); 
repository2.Expect(r => r.Method2()).Return(someValue); 

... 

var service = new Service(repository1, repository2, ...); 

repository1.VerifyAllExpectations(); 
repository2.VerifyAllExpectations(); 

Grâce à ce mécanisme, vous pouvez contrôler la façon dont l'objet simulé répond à votre classe sous test et vous isoler votre code de test de dépendances connexes. Vous pouvez également tester que votre classe sous test interagit correctement avec les classes dont elle dépend en vérifiant que les attentes que vous avez définies ont été satisfaites (appelées). En ce qui concerne le nombre de paramètres dans le constructeur, envisagez de fournir un constructeur par défaut qui ne prend aucun paramètre et qui a des paramètres publics pour les dépendances. Ensuite, vous pouvez utiliser les mécanismes de commodité dans C# 3.0 pour les définir.

var service = new Service { 
    Repository1 = repository1, 
    Repository2 = repository2, 
    ... 
}; 
+0

Je vois où vous allez avec cela, et en fait votre message a créé un moment "aha" pour moi lié à la moquerie. – mxmissile

2

Parfois (surtout si elle est code de test) un peu de reformatage de code peut faire l'affaire . Alors que

var service = new ServiceClass(new Repository1(), new Repository2(), new ServiceClass2()); 

est certainement difficile à lire, ceci:

var service = new ServiceClass(
    new Repository1(), 
    new Repository2(), 
    new ServiceClass2() 
); 

semble un peu mieux (au moins pour moi).

Questions connexes