2010-03-26 10 views
5

ho creato un metodo di estensione chiamata HasContentPermission sul System.Security.Principal.IIdentity:Perché il mio metodo di estensione non viene visualizzato nella mia classe di test?

namespace System.Security.Principal 
{ 
    public static class IdentityExtensions 
    { 
     public static bool HasContentPermission 
      (this IIdentity identity, int contentID) 
     { 
      // I do stuff here 
      return result; 
     } 
    } 
} 

E mi chiamano così:

bool hasPermission = User.Identity.HasPermission(contentID); 

funziona come un fascino. Ora voglio testare l'unità. Per fare questo, tutto quello che ho davvero bisogno di fare è chiamare il metodo di estensione direttamente, in modo da:

using System.Security.Principal; 

namespace MyUnitTests 
{ 
    [TestMethod] 
    public void HasContentPermission_PermissionRecordExists_ReturnsTrue() 
    { 
     IIdentity identity; 
     bool result = identity.HasContentPermission(... 

Ma HasContentPermission no intellisense. Ho provato a creare una classe stub che eredita da IIdentity, ma non ha funzionato. Perché?

O sto andando su questo nel modo sbagliato?

+0

La sintassi nel primo blocco di codice è errata - non è possibile definire un metodo in un ambito di nomi ... È possibile inserire il codice effettivo? –

+1

Sei sicuro che il tuo progetto di test fa riferimento all'assieme in cui risiede il tuo metodo di estensione (anziché solo lo spazio dei nomi)? –

+0

@Reed: ho modificato la domanda per aggiungere il codice mancante. –

risposta

14

assicurati di aver:

  1. fatto la classe statica
  2. fatto la classe di accesso al codice chiamante
  3. incluso this prima del tipo di estendere
  4. costruito il progetto contenente l'estensione
  5. aggiunto un riferimento al progetto nel progetto di test dell'unità
  6. aggiunto un using mypackage; a qualsiasi file sorgente che utilizza il metodo di estensione se il tuo metodo di estensione è contenuto in un altro pacchetto

Nota che hai anche (presumo) un errore nel tuo esempio in quanto il metodo non è in una classe.

Infine, eviterei di inserire metodi negli spazi dei nomi .NET ufficiali. Può solo essere fonte di confusione per chiunque venga dopo di te che potrebbe pensare che il metodo sia un metodo ufficialmente supportato quando in realtà è tuo e contenuto nel tuo progetto.

+0

Grazie. Ho dimenticato di aggiungere un riferimento al progetto principale nel progetto di test. Mi dimentico sempre di farlo. Per qualche ragione presumo sempre che, poiché entrambi i progetti sono nella stessa soluzione, sono consapevoli l'uno dell'altra. –

+1

Anche se hai ragione sui fatti, non sono d'accordo con la tua opinione sull'estensione delle classi quadro. Questo è il loro scopo * primario *. –

+2

@Steven - Va bene estendere le classi del framework. Ciò che è male è mettere quelle estensioni nello spazio dei nomi framework. – Greg

2

Il metodo di estensione deve essere in una classe statica. Dov'è la tua classe statica? Il tuo codice viene compilato?

+0

Siamo spiacenti. Ho modificato la domanda per aggiungere il codice mancante. –

3

Sospetto che abbia qualcosa a che fare con il fatto che hai aggiunto un metodo di estensione allo spazio dei nomi esistente System.Security.Principal. Assicurati di fare riferimento al progetto che definisce il metodo di estensione, o provalo con uno spazio dei nomi diverso.

+0

+1 per referenziare il progetto ... Questo era il problema. –

+0

+1 per il problema dello spazio dei nomi. Questo era il mio problema – Sumant

Problemi correlati