Pourquoi ma Méthode d'Extension ne s'affiche pas dans ma classe de test?
J'ai créé une extension de la méthode appelée HasContentPermission
sur le System.Security.Principal.IIdentity
:
namespace System.Security.Principal
{
public static class IdentityExtensions
{
public static bool HasContentPermission
(this IIdentity identity, int contentID)
{
//I do stuff here
return result;
}
}
}
Et je l'appelle comme ceci:
bool hasPermission = User.Identity.HasPermission(contentID);
Fonctionne comme un charme. Maintenant, je veux de l'unité de test. Pour ce faire, tout ce que je vraiment besoin de faire est d'appeler la méthode d'extension directement, de sorte que:
using System.Security.Principal;
namespace MyUnitTests
{
[TestMethod]
public void HasContentPermission_PermissionRecordExists_ReturnsTrue()
{
IIdentity identity;
bool result = identity.HasContentPermission(...
Mais HasContentPermission
ne intellisense. J'ai essayé de créer un stub de classe qui hérite de IIdentity
, mais cela ne fonctionne pas non plus. Pourquoi?
Ou je suis aller sur ce de la mauvaise façon?
- Votre syntaxe dans le premier bloc de code est erroné, vous ne pouvez pas définir une méthode dans un espace de noms de champ... Pouvez-vous mettre dans votre code?
- Êtes-vous sûr de votre projet de test est de référencement à l'assemblée que votre Méthode d'Extension de vie (au lieu de juste l'espace de noms)?
- J'ai édité la question d'ajouter le code manquant.
Vous devez vous connecter pour publier un commentaire.
Assurez-vous que vous avez:
this
avant que le type d'étendreusing mypackage;
de n'importe quel fichier source qui utilise la méthode d'extension si votre méthode d'extension est contenue à l'intérieur d'un package différentNotez que vous avez aussi (je suppose) une faute de frappe dans votre exemple, que la méthode n'est pas dans une classe.
Enfin, je voudrais éviter de mettre des méthodes dans les actes officiels .NET les espaces de noms. Il ne peut qu'être source de confusion pour ceux qui viennent après vous, qui pourrait penser que la méthode est officiellement prise en charge de la méthode alors qu'en réalité, il est de votre propre et contenue dans votre projet.
MyProject.SecurityExtensions
espace de noms et de les mettre dans le .Net framework classes de nature à induire en erreur. Vous n'avez aucun moyen de savoir qui est votre extensions personnalisées sans aller à la source. Si c'est dans votre propre espace de noms, juste planant au-dessus, il vous dit qu'il est sur mesure.MyCompany.Core
assemblée nous transporter sur tous nos projets. Nous avons mis nos extensions de là. Si je tourne sur une méthode qui a dit "le Système de.De sécurité.Principal.DoSomething" je m'attends à trouver DoSomething ici msdn.microsoft.com/en-us/library/system.security.principal.aspx. Si elle dit MyCompany.De base.SecurityExtensions.DoSomethig, je sais exactement où elle est. Je voudrais aussi être plus susceptibles de CTRL+Clic pour accéder à la source si je savais que nous l'avons écrit.using
. J'ai effectué cette une couple de fois, quand j'ai mis toutes les méthodes d'extension dans une seule classe statique dans mon propre paquet et puis se demande pourquoi ils n'apparaissent dans le lieu habituel..System
sens parfait.Je suppose que cela a quelque chose à voir avec le fait que vous avez ajouté une méthode d'extension de l'existant
System.Security.Principal
espace de noms. Assurez-vous que vous faites référence à la projet qui définit la méthode d'extension, ou essayer avec un autre espace de noms.La méthode d'extension doit être dans une classe statique. Où est votre classe statique? Est-ce que votre code compiler?