Puis-je demander à NSubstitute de se moquer de mes cours concrets?
J'ai une interface qui je suis moqueur avec "NSubstitute' qui contient des propriétés qui retour concreate classes, qui est la valeur de retour n'est pas une interface. e.g
public interface ISomething
{
SomeObj First { get; }
SomeObj Second { get; }
}
Le "SomeObj concrète de la classe a un constructeur par défaut, mais "NSubstitute' renvoie toujours la valeur 'null' pour ces propriétés. La classe elle-même n'est pas sous mon contrôle, je ne peux donc pas simplement le faire dériver d'une interface.
Peut "NSubstitute' se moquer de ce type de propriétés? Ou est-il un moyen de remplacer le comportement? Sinon, je dois manuellement initialiser la maquette avant le test et qui peut être beaucoup de code (même si son réutilisé à l'aide d'une méthode commune).
Il y a peut être une solution plus simple que j'ai négligé?
source d'informationauteur karmasponge
Vous devez vous connecter pour publier un commentaire.
Classes seront auto-moqué si ils ont une valeur par défaut (sans paramètre) constructeur et tous ses membres sont virtuel (voir la note dans l'intro de Auto et récursive se moque de). L'objectif est de réduire le risque de non désiré (destructeur?) des effets secondaires, si nous sommes à l'aide d'un substitut et d'un coup, un non-virtuel, unmocked chemin de code qui fait de mauvaises choses dans une instance, nous avons pensé était un faux.
NSubstitute n'ont pas un moyen de remplacer ce comportement. Au lieu de cela, je vous recommande la création de tous vos substituts par l'intermédiaire de votre propre usine de méthode (par exemple, un statique
Sub.For<T>(...)
méthode dans votre projet de test) qui utilise NSubstitute pour produire un substitut, puis applique l'ensemble des règles d'initialisation vous avez besoin, comme l'utilisation de la réflexion à talon de valeurs pour chaque propriété de la classe.Espère que cette aide.
Éventuellement liens connexes:
Il ne compte pas en tant que auto-moqueur, mais vous avez aussi demander "Ou est-il un moyen de remplacer le comportement?" et "peut-être il y a une solution plus simple que j'ai négligé?"
Cette réponse s'appuie sur les déclarations de votre question:
SomeObj
est une classe à l'extérieur de votre commande, à partir de laquelle je suppose que c'est soit séparément, à l'essai ou d'autre pas testableSomeObj
a un constructeur par défautSûr, cela vous oblige à "initialiser manuellement la maquette avant le test" mais puisque vous ne l'avez pas dit nous ce que cet objet est qu'il n'est pas possible de savoir combien de temps il faudrait pour mettre en œuvre pleinement.
Une autre approche, mais pas sans ses propres inconvénients, serait d'extraire votre propre interface pour
SomeObj
quelque chose comme ceci:et puis se moquer de
ISomeObj
dans votre test.