C# - comment tester les méthodes d'extension?
J'ai créé ce C# méthode d'extension pour un Person
classe:
public static class PersonExtensions {
public static void Rename(this Person person, String newName) {
person.Name = newName;
}
}
Comment aurais-je de l'unité de tester cette méthode? Je l'ai essayé, mais le Rename
méthode n'est pas disponible à partir de la PersonAccessor
objet.
Erreur a été "privé-accesseur pour le renommage n'a pas été trouvé"
Quand j'essaie PersonExtensions_Accessor.Renommer(somePerson, newName), il est dit "il y a quelques arguments non valides"
Est la méthode d'extension stockées dans un espace de noms, vous n'êtes pas le référencement?
Est le
Comme toute méthode d'extension, vous pouvez accéder à la méthode, comme toute méthode statique parce que c'est ce qu'il est vraiment. Vous devriez être en mesure de faire quelque chose comme
Qu'est-ce que l'erreur de compilation que vous voyez lorsque vous essayez de préciser la personne.Rename("");
PersonExtensions.Renommer( pers, "certains" );
Est le
PersonAccessor
classe dans un espace de noms différent? Si oui, vous aurez besoin de using
l'espace de noms qui contient PersonExtensions
Comme toute méthode d'extension, vous pouvez accéder à la méthode, comme toute méthode statique parce que c'est ce qu'il est vraiment. Vous devriez être en mesure de faire quelque chose comme
PersonExtensions.Rename(myPersonInstance, myNewName)
.Qu'est-ce que l'erreur de compilation que vous voyez lorsque vous essayez de préciser la personne.Rename("");
PersonExtensions.Renommer( pers, "certains" );
OriginalL'auteur ryyst | 2012-06-21
Vous devez vous connecter pour publier un commentaire.
Les méthodes d'Extension sont tout sucre syntaxique pour une autre façon de référence de la méthode statique. Appelez simplement
PersonExtensions.Rename(...)
dans votre unité de test.Person
, pasPersonExtensions
.Il va à l'encontre du but de la création d'une méthode d'extension si vous n'utilisez pas la classe qui est en cours d'extension. Le test serait plus précise si elle a appelé
new Person(...).Rename(newName)
Il dit: "le privé accesseur pour le renommage n'a pas été trouvé". Qu'est-ce que cela signifie? Lorsque j'essaie
PersonExtensions_Accessor.Rename(somePerson, newName)
, il dit: "il y a quelques arguments non valides".Qu'est-ce que
PersonExtensions_Accessor
? Est-il censé avoir les méthodes statiques dansPersonExtensions
?Vous pouvez appeler cela soit
personObject.Rename("new name");
ouPersonExtensions.Rename(personObject, "new name");
. Les deux sont valables.OriginalL'auteur Tim S.
Je pense qu'une bonne approche pourrait être de tester directement la méthode d'extension dans une instance de
Person
.En tenant compte de la méthode que vous avez mis en œuvre, un exemple de code serait quelque chose comme ceci:
N'oubliez pas de référence à la fois
Person
etPersonExtension
classes et d'avoir la bonne des niveaux cachés dans l'utilitaire de la classe afin de pouvoir accéder à ses méthodesOriginalL'auteur emibloque
Voici mon code de production:
Voici la version modifiée de test générés:
Le test passe.
Person
, seulement unPersonAccessor
. De même, je ne peux pas accéderPersonExtensions
directement, au lieu de cela j'ai utiliserPersonExtensions_Accessor
.J'ai utilisé la génération de test de fonctionnalité de Visual Studio 2010, et il a produit un test qui jette un null-réf. J'ai édité ma réponse à inclure un test de passage.
quelles sont les différences entre les déclarations de la Personne et PersonAccessor dans votre code? Quels sont les espaces de noms et quels sont les spécificateurs d'accès? (essayez d'utiliser un réflecteur ou d'un objet navigateur)
OriginalL'auteur GregC