2011-12-01 11 views
5

Sto usando nuit con moq per testare i miei controller.passaggio parametro simulato all'interfaccia fittata

Io uso una classe di sessione che ha un'interfaccia e un HttpContext è iniettato nel costruttore usando ninject. simili

 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; 

     } 

ritengo per verificare il controller ho deridere HttpContext prima e poi passare tale oggetto nel l'construtor del ISession deriso. ho questo finora

[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"); 
     } 

che costruisce ma NUnit restituisce il seguente errore quando il test viene eseguito

System.NotSupportedException: Tipo di deridere deve essere un'interfaccia o una classe astratta o non sigillati.

Grazie per tutto l'aiuto.

+0

sguardo 'HttpContextBase' –

+0

se si ha realmente bisogno di prendere in giro qualsiasi classe sigillata con il vostro comportamento personalizzato, guarda progetto talpe di Microsoft. –

risposta

2

Fare in modo che la sessione assuma un HttpContextBase nel costruttore e utilizzarlo come tipo di proprietà. Dovresti comunque essere in grado di passare un HttpContext concreto alla sessione nel codice di produzione.

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

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

Poi risolvere il tuo test di unità passando "mockHttpContext.Object" al costruttore sessione e che fa il verso alla 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

questo non ha funzionato immediatamente perché ho ottenuto un errore affermando "Gli argomenti del costruttore non possono essere passati per le interfacce". ma ho semplicemente rimosso il parametro mockhttpcontext e il test ha funzionato bene. L'interfaccia fittizia in realtà non ha bisogno dei parametri del costruttore che hanno senso. – Jules

Problemi correlati