2009-01-12 8 views

Répondre

0

Étant donné que vos composants peuvent avoir leurs propres dépendances ou effectuer une initialisation je couvrais ce scénario avec UTS.

Quelque chose comme

iocContainer.Register(typeof(MyService1)); 
service = iocContainer.Get(typeof(MyService)); 
Debug.AssertNotNull(service); 
2

Au printemps, vous pouvez avoir un test unitaire qui se charge simplement le contexte d'application sans affirmer quoi que ce soit. C'est en fait un test assez utile en conjonction avec la construction automatique, car le printemps se plaint de beaucoup de problèmes lors du chargement du contexte complet.

0

J'utilise Windsor dans un projet ASP.NET MVC où je l'ai écrit un test simple pour vérifier que tous les contrôleurs peuvent être instanciés (à savoir leurs dépendances peuvent être résolus). J'ai un test pour chaque configuration du site web (par exemple "développement", "test", "someProductionSite", etc.) où je crée mon conteneur Windsor avec cette configuration particulière et boucle à travers toutes les implémentations non-abstraites de IController, en vérifiant que je peux résoudre une instance de chacun.

Depuis l'usine de contrôleur est le seul point d'entrée dans l'application qui se traduira par une container.Resolve (...), je suis certain à 100% que toutes les configurations sont valides.

En général, j'ai trouvé que les tests d'écriture qui fonctionnent comme des affirmations sur l'ensemble du système sont extrêmement utiles et précieux.

E.g. J'affirme également que toutes les actions du contrôleur sont virtuelles, ce qui est une exigence, car j'utilise la gestion automatique des transactions de Castle pour entourer les actions du contrôleur avec des transactions.

1

@aku, @krosenvold et @mookid faire un argument convaincant pour tester que la configuration des dépendances est correcte.
Je ne pense pas que ce soit unité test cependant.
Que faites-vous tester? Vous n'essayez pas de tester le conteneur lui-même (sans doute ce n'est pas le code que vous avez écrit ou que vous maintenez).
Ce que vous essayez de tester, c'est que toutes les dépendances d'un type particulier peuvent être créées et que le type peut être résolu. Cela ressemble à un test système ou un test d'intégration très utile à avoir dans votre environnement d'intégration continue. Une fois que vous avez des binaires qui réussissent le test unitaire, vous pouvez créer le conteneur et exécuter la configuration du conteneur sur une machine qui reflète votre environnement de production et tester que chacun des types que le conteneur doit pouvoir résoudre peut réellement être créé et toutes leurs dépendances peuvent être instanciées.
Ce serait bien d'exécuter ceci dans une nouvelle machine virtuelle à laquelle vous avez appliqué votre dernier programme d'installation.

0

Il peut être utile parce que certains cadres d'injection de dépendance (comme l'unité) ont des règles étranges pour choisir quel constructeur à appeler. Je recommanderais certainement des tests unitaires pour m'assurer que l'enregistrement et la création de votre type se passent avec succès.

2

Cela me semble en quelque sorte erroné de faire fonctionner le conteneur IoC dans mes projets de test. J'ai également remarqué que la plupart des bogues provoqués par les dépendances ne sont pas résolus parce que les dépendances d'ordre sont résolues, c'est très difficile à tester correctement et ce n'est pas quelque chose que je voudrais faire en test unitaire.

Habituellement j'utilise des instructions Debug.Assert dans les routines d'initialisation de mes classes. Cela me donne un système d'alerte précoce pour les erreurs liées à l'IoC et permet également de mieux spécifier les dépendances dans mon code.

1

Ce que je fais avec le conteneur Guice IoC, c'est que je produis d'abord les classes pour certaines fonctions utilisant TDD sans Guice (ce sont des tests unitaires). Ensuite, je crée un test d'intégration pour cette fonctionnalité avec Guice. À ce stade, la configuration de l'IoC (module Guice) est incomplète, de sorte que le test d'intégration échouera. En utilisant TDD, j'ajoute la configuration IoC étape par étape jusqu'à ce que le test d'intégration réussisse. Je n'ajouterai aucune annotation @Inject, ligne de configuration ou déclaration de portée, à moins que cela ne soit nécessaire pour réussir un test. Par conséquent, j'aurai des tests d'intégration (ou d'acceptation) pour m'assurer que la configuration de l'IoC est correcte et complète.

Cette même méthode devrait fonctionner avec n'importe quel conteneur IoC ou autre système, dont la configuration est si complexe qu'elle risque de se rompre - n'écrivez aucune configuration sauf si vous devez passer un test.

+0

post-scriptum Dans certains projets, j'écris également des tests pour la configuration de la construction, surtout s'il y a des exigences complexes telles que l'utilisation de maven-shade-plugin. Voici un exemple de comment je l'ai fait dans un projet: http://www.orfjackal.net/lets-code#jumi –