Dans une question récente sur le stubbing, de nombreuses réponses suggèrent des interfaces C# ou des délégués pour implémenter des stubs, mais one answer suggère d'utiliser la compilation conditionnelle, en conservant la liaison statique dans le code de production. Cette réponse a été modulée -2 au moment de la lecture, donc au moins 2 personnes ont vraiment pensé que c'était une réponse mauvaise. Peut-être que l'abus de DEBUG était la raison, ou peut-être l'utilisation d'une valeur fixe au lieu d'une validation plus étendue. Mais je ne peux m'empêcher de me demander:La compilation conditionnelle est-elle une stratégie de simulation/tronçon valide pour les tests unitaires?
L'utilisation de la compilation conditionnelle est-elle une technique inappropriée pour implémenter des talons de test unitaires? Parfois? Toujours?
Merci.
Edit-add: Je voudrais ajouter un exemple comme une expérience bien:
class Foo {
public Foo() { .. }
private DateTime Now {
get {
#if UNITTEST_Foo
return Stub_DateTime.Now;
#else
return DateTime.Now;
#endif
}
}
// .. rest of Foo members
}
comparant à
interface IDateTimeStrategy {
DateTime Now { get; }
}
class ProductionDateTimeStrategy : IDateTimeStrategy {
public DateTime Now { get { return DateTime.Now; } }
}
class Foo {
public Foo() : Foo(new ProductionDateTimeStrategy()) {}
public Foo(IDateTimeStrategy s) { datetimeStrategy = s; .. }
private IDateTime_Strategy datetimeStrategy;
private DateTime Now { get { return datetimeStrategy.Now; } }
}
qui permet la dépendance sortante sur "DateTime.Now" être écrasé par une interface C#. Cependant, nous avons maintenant ajouté un appel de dispatch dynamique où static suffirait, l'objet est plus grand même dans la version de production, et nous avons ajouté un nouveau chemin d'échec pour le constructeur de Foo (allocation peut échouer).
Est-ce que je ne m'inquiète de rien ici? Merci pour les commentaires jusqu'à présent!
Voulez-vous dire "ceci est acceptable pour les bases de code existantes lors de l'ajout incrémentiel de tests unitaires" ou "cela fonctionne en C++, mais devrait être découragé lors du démarrage d'un nouveau projet C++"? – Aaron
Première clause dans votre séquence OR. C'est une bonne technique pour tester le code existant sans trop perturber le code (vous n'êtes pas sûr de faire ces changements car vous n'avez pas le filet de sécurité des tests). – Gishu
Merci, ça a plus de sens. – Aaron