2010-03-26 18 views
5

creé un método de extensión llamado HasContentPermission en el System.Security.Principal.IIdentity:¿Por qué mi método de extensión no aparece en mi clase de prueba?

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

Y lo llaman así:

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

funciona como un encanto. Ahora quiero probarlo en una unidad. Para hacer eso, todo lo que realmente necesita hacer es llamar al método de extensión directa, por eso:

using System.Security.Principal; 

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

Pero no lo hará HasContentPermission IntelliSense. Traté de crear una clase de stub que herede de IIdentity, pero tampoco funcionó. ¿Por qué?

¿O estoy haciendo esto de la manera incorrecta?

+0

Su sintaxis en el primer bloque de código es incorrecta - no puede definir un método en un ámbito de espacio de nombres ... ¿Puede poner su código actual? –

+1

¿Está seguro de que su proyecto de prueba hace referencia al ensamblaje en el que vive su Método de extensión (en lugar de solo el espacio de nombre)? –

+0

@Reed: edité la pregunta para agregar el código faltante. –

Respuesta

14

Asegúrese de que ha:

  1. hizo la clase estática
  2. hizo la clase acceso al código de llamada
  3. incluido this antes del tipo de extender
  4. construyeron el proyecto que contiene la extensión
  5. agregó una referencia al proyecto en su proyecto de prueba de unidad
  6. agregó un using mypackage; a cualquier archivo fuente que use el método de extensión si su método de extensión está dentro de un paquete diferente

Tenga en cuenta que también tiene (supongo) un error tipográfico en su ejemplo porque el método no está en una clase.

Finalmente, evitaría poner métodos en los espacios de nombres .NET oficiales. Solo puede ser confuso para cualquiera que venga después de ti que piense que el método es oficialmente compatible, cuando en realidad es tuyo y está contenido en tu proyecto.

+0

Gracias. Olvidé agregar una referencia al proyecto principal en el proyecto de prueba. Siempre me olvido de hacer eso. Por alguna razón, siempre asumo que, debido a que ambos proyectos están en la misma solución, que están conscientes el uno del otro. –

+1

Aunque tenga razón en los hechos, tengo que estar en desacuerdo con su opinión sobre la ampliación de las clases marco. Este es su objetivo * primario *. –

+2

@Steven - Está bien ampliar las clases de framework. Lo malo es poner esas extensiones en el espacio de nombres del marco. – Greg

2

El método de extensión debe estar en una clase estática. ¿Dónde está tu clase estática? ¿Compila tu código?

+0

Lo siento. Edité la pregunta para agregar el código faltante. –

3

Sospecho que tiene algo que ver con el hecho de que ha agregado un método de extensión al espacio de nombres existente System.Security.Principal. Asegúrese de hacer referencia al proyecto que define el método de extensión, o inténtelo con un espacio de nombres diferente.

+0

+1 para hacer referencia al proyecto ... Ese fue el problema. –

+0

+1 por problema de espacio de nombre. Ese fue mi problema – Sumant

Cuestiones relacionadas