2011-12-01 9 views
5

Estoy usando nuit con moq para probar mis controladores.pasando el parámetro burlado a la interfaz simulada

Uso una clase de sesión que tiene una interfaz y un HttpContext se inyecta en el constructor usando ninject. como este

 public class SessionService : ISession 
     { 
      public HttpContext Context { get; set; } 

      public SessionService(HttpContext context) 
      { 
       this.Context = context; 
      } 
    } 


     public interface ISession 
     { 
      HttpContext Context { get; set; } 
    } 



    public HomeController(ISession session) 
     { 
      _session = session; 

     } 

pienso con el fin de probar el controlador He burlarse de la HttpContext primero y luego pasar ese objeto en el la construtor de la ISession burlado. tengo esto hasta ahora

[Test] 
public void index_returns_view() 
     { 
      //arrange 
      var mockHttpContext = new Mock<HttpContext>(); 
      var mockContext = new Mock<ISession>(mockHttpContext); 
      var c = new HomeController(mockContext.Object); 
      //act 
      var v = c.Index() as ViewResult; 
      //assert 
      Assert.AreEqual(v.ViewName, "Index", "Index View name incorrect"); 
     } 

que construye pero nunit devuelve el siguiente error cuando se realiza la prueba

System.NotSupportedException: Tipo de burlarse debe ser una interfaz o una clase abstracta o no sellado.

Gracias por la ayuda.

+0

mirada en 'HttpContextBase' –

+0

si realmente necesita para burlarse de cualquier clase cerrada con su comportamiento personalizado, mira lunares proyecto de Microsoft. –

Respuesta

2

Haga que su sesión tome una HttpContextBase en el constructor y utilícela como el tipo de la propiedad. Aún debe poder pasar un HttpContext concreto a la sesión en el código de producción.

public class SessionService : ISession 
    { 
     public HttpContextBase Context { get; set; } 

     public SessionService(HttpContextBase context) 
     { 
      this.Context = context; 
     } 
} 

luego fijar su unidad de prueba pasando "mockHttpContext.Object" al constructor reunión y que se burla de la HttpContextBase.

[Test]  
public void index_returns_view()  
     {  
      //arrange  
      var mockHttpContext = new Mock<HttpContextBase>();  
      var mockContext = new Mock<ISession>(mockHttpContext.Object);  
      var c = new HomeController(mockContext.Object);  
      //act  
      var v = c.Index() as ViewResult;  
      //assert  
      Assert.AreEqual(v.ViewName, "Index", "Index View name incorrect");  
     } 
+0

esto no funcionó de inmediato porque recibí un error que decía "Los argumentos del constructor no se pueden pasar para los simulacros de la interfaz". pero simplemente eliminé el parámetro mockhttpcontext y la prueba funcionó bien. La interfaz burlada no necesita los parámetros del constructor que tienen sentido. – Jules

Cuestiones relacionadas