2010-02-25 7 views
1

J'essaie de nettoyer mon code pour le rendre testable à l'unité. Je sais que des tests unitaires doivent être créés lors du codage mais ... Je dois le faire maintenant, avec le code complété.classe d'affaires de conception pour test unitaire

Ma classe d'affaires est plein de méthodes avec une implémentation similaire comme:

var rep=new NHrepository<ModelClass1>(Session); 
rep.Where(x=>x.Field1==1).ToList(); 

première erreur (de mon point de vue) est que je ne dois pas utiliser « nouveau », mais plutôt utiliser DI et ajouter dans les paramètres de ctor un INHrepository modelClass1Repository.

Si dans ma classe j'ai plusieurs référentiels de classes de modèles différents? Chacun doit être dans le ctor? Ou probablement business class n'est pas construit avec le principe SeparationOfConcern?

Répondre

1

Vous avez raison à propos de l'injection de dépendance.

En outre, je vous recommande fortement de lire Working Effectively with Legacy Code si vous envisagez d'écrire des tests unitaires pour votre code existant.

1

Une approche largement utilisée est d'avoir des référentiels n en tant que paramètres à vos constructeurs comme vous soupçonnaient déjà

Une autre approche couramment utilisée consiste à utiliser un cadre d'injection de dépendance tels que Ninject. Cela vous permet d'écrire des choses comme:

[Inject] 
public IAbstractRepository<Company> companiesRepository { get; private set; } 

[Inject] 
public IAbstractRepository<User> usersRepository { get; private set; } 

Vous pouvez alors Ninject injecter la mise en œuvre appropriée de l'interface en fonction du scénario d'utilisation (par exemple, un dépôt de faux pour les tests ou un véritable référentiel pour la production)

+0

Je pense que ce n'est pas une bonne approche car une propriété peut être "non définie", mais un paramètre ctor ne peut pas. Dans mon cas, un référentiel DOIT être défini, donc je suppose qu'il est préférable de le laisser dans le ctor. –

+0

Je pense que vous ne comprenez pas l'exemple de code que j'ai donné ci-dessus. Dans l'exemple ci-dessus, les dépôts seraient automatiquement instanciés automatiquement (en d'autres termes, définis) par Ninject chaque fois que vous instanciez un objet contenant ces propriétés. Il n'y a aucun moyen d'oublier d'instancier vos dépôts. Je ne peux pas vraiment voir de différences majeures à instancier les via le constructeur, sauf que c'est moins d'effort et garde votre code un peu plus flexible. –

0

Votre classe affaires devrait avoir un constructeur avec 2 paramètres, un pour chaque référentiel. Votre entreprise devrait exposer 2 interfaces, et votre persistance devrait fournir leurs implémentations.

Questions connexes