2010-05-05 28 views
5

hoy he pedido este question.Moq: no se ha podido convertir a la interfaz

Así que como moq crea su propia clase desde una interfaz no pude convertirla en una clase diferente.

Me llevé a preguntar qué pasaría si crease un ICustomPrincipal y traté de convertirlo en eso.

Así es como mi burla miran:

var MockHttpContext = new Mock<HttpContextBase>(); 
var MockPrincipal = new Mock<ICustomPrincipal>(); 

MockHttpContext.SetupGet(h => h.User).Returns(MockPrincipal.Object); 

En el método que estoy tratando de probar el código de seguimiento da el error (de nuevo):

var user = (ICustomPrincipal)httpContext.User; 

El error es el siguiente:

Unable to cast object of type 'IPrincipalProxy4081807111564298854aabfc890edcc8' 
to type 'MyProject.Web.ICustomPrincipal'. 

Supongo que todavía necesito algo de práctica con interfaces y moq pero no debería ser capaz de lanzar la clase que mo q creado de nuevo a ICustomPrincipal? Sé que httpContext.User devuelve un IPrincipal así que tal vez algo se pierde allí?

Bueno, si alguien puede ayudarme, lo agradecería.

Pickels

Editar:
conforme a lo solicitado el código completo del método que estoy probando. Todavía no está terminado, pero esto es lo que tengo hasta ahora:

public bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    if (httpContext == null) 
    { 
     throw new ArgumentNullException("httpContext"); 
    } 

    var user = (ICustomPrincipal)httpContext.User; 

    if (!user.Identity.IsAuthenticated) 
    { 
     return false; 
    } 

    return true; 
} 

Edit2:

Parece que si uso Thread.CurrentPrincipal en lugar de HttpContext.Current.User puedo echarlo sin ningún problema . Leyendo sobre las diferencias entre los dos ahora.

Respuesta

0

Creo que se necesita para ser capaz de inyectar su burla en su código ...

Por ejemplo, en la clase si se agrega lo siguiente:

public static HttpContextBase HttpContext; 
public static ICustomPrincipal User; 

y tienen el siguiente código en su ...

var user = (ICustomPrincipal)User; 

y en su clase bajo prueba (es decir que ClassUnderTest llamado)

ClassUnderTest.HttpContextBase = MockHttpContext.Object; 

y

ClassUnderTest.User = MockPrincipal.Object; 

bueno ... Creo que eso debería arreglar las cosas para usted.

1

Su ejemplo de código muestra que se está burlando de un contexto http y objetos principales.

Sin embargo, su ejemplo de código en el que está tratando de obtener al usuario es difícil determinar si está utilizando el contexto http de Mock o uno proporcionado por el marco de trabajo.

var user = (ICustomPrincipal)httpContext.User; 

¿La línea de arriba se usa en un método u objeto que usa la inyección de dependencia?

¿Puede mostrarme el método/objeto como un todo?

+0

Agregué el código a mi pregunta. – Pickels

+1

¿Puede mostrarme cómo utiliza este método en el contexto de la prueba unitaria? Estoy viendo cómo configurar los objetos simulados y llamar al método en la prueba unitaria. – Shane

0

Supongo que tiene alguna confusión en los espacios de nombres/nombres de interfaz. ¿Estás seguro, estás recurriendo al mismo ICustomPrincipal, para el cual creas tu simulacro?

¿Y por qué dice "IPrincipalProxy" en el mensaje de error? ¿Te estás burlando de la interfaz IPrincipal? Entonces, ¿cuál es la relación entre IPrincipal y ICustomPrincipal?

Cuestiones relacionadas