2011-12-01 17 views
5

Używam nuit z moq do testowania kontrolerów.przekazywanie wyśmiewanego parametru do wyśmiewanego interfejsu

Używam klasy sesji, która ma interfejs i HttpContext jest wstrzykiwany do konstruktora przy użyciu ninject. jak ten

 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; 

     } 

myślę, że w celu przetestowania kontrolera mam pierwszy mock HttpContext a następnie przekazać ten obiekt do tej konstruktor z wyśmiewali ISession. mam to tak daleko

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

która buduje ale nunit zwraca następujący błąd, gdy badanie przeprowadzane jest

System.NotSupportedException: Rodzaj aby Mock musi być interfejs lub abstrakcyjne lub niezgrzewane klasę.

Dzięki za pomoc.

+0

spojrzenie 'HttpContextBase' –

+0

jeśli naprawdę trzeba kpić każdą zamkniętą klasę z niestandardowego zachowania, spojrzeć na projekt molami Microsoftu. –

Odpowiedz

2

Poproś, aby sesja zajęła HttpContextBase w konstruktorze i użyj jej jako typu właściwości. Powinieneś być w stanie przekazać konkretny HttpContext sesję w kodzie produkcyjnym.

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

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

Następnie rozwiązać test jednostkowy przekazując „mockHttpContext.Object” do konstruktora sesji i że kpi z 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

to nie działa od razu, ponieważ otrzymałem komunikat o błędzie "Nie można przekazać argumentów konstruktora dla makr interfejsu." ale po prostu usunąłem paramtekstowy tekst i test zadziałał dobrze. Wyśmiewany interfejs rzeczywiście nie wymaga paramerów konstruktora, co ma sens. – Jules

Powiązane problemy