2016-04-27 31 views
8

Anche se ci sono un paio di messaggi su StackOverflow di test di unità d'azione Risultato in MVC, ho una domanda specifica ....Unit Testing ViewResult in Asp.NET MVC

Ecco il mio ActionResult nel controller:

public ActionResult Index() 
{ 
    return View(db.Products.ToList()); 
} 

ogni elemento ha attributi Prodotti diversi, come nome, foto, quantità ecc .. ho scritto un TestMethod per questo metodo .It appare come segue:

private CartEntity db = new CartEntity(); 

[TestMethod] 
public void Test_Index() 
{ 
    //Arrange 
    ProductsController prodController = new ProductsController(); 

    ViewResult = prodController.Index(); 


} 

Cosa devo confrontare in questo caso poiché non ci sono parametri passati nell'Index Action

+0

Secondo il vostro codice 'Index()' restituisce un 'ViewResult' e non un' RedirectToRouteResult' quindi sono confuso sia per il codice di test unitario che per la vostra domanda. – Igor

+0

Ehi @Igor, Grazie .. Il mio codice effettivo è errato –

+1

'Assert.IsInstanceOfType (risultato, typeof (RedirectToRouteResult));' fallirà comunque secondo il tuo ultimo aggiornamento. 'Index' restituisce ancora' ViewResult' – Igor

risposta

8

Dai un'occhiata alla classe ViewResult, questo ti può mostrare cos'altro potresti testare. Quello che devi fare è prendere in giro il tuo DbContext e fornirlo con i dati nella proprietà Products (DbSet<>) come viene chiamato nell'azione del tuo controller. Sarà quindi possibile testare

  1. Il tipo viene restituito
  2. Il modello sul ViewResult
  3. Il ViewName che dovrebbe essere vuota o Indice

codice di esempio

[TestMethod] 
public void Test_Index() 
{ 
    //Arrange 
    ProductsController prodController = new ProductsController(); // you should mock your DbContext and pass that in 

    // Act 
    var result = prodController.Index() as ViewResult; 

    // Assert 
    Assert.IsNotNull(result); 
    Assert.IsNotNull(result.Model); // add additional checks on the Model 
    Assert.IsTrue(string.IsNullOrEmpty(result.ViewName) || result.ViewName == "Index"); 
} 

Se si ne ed aiuta a deridere un DbContext ci sono quadri e articoli esistenti su questo argomento. Ecco uno di Microsoft dal titolo Testing with a mocking framework. Idealmente dovresti iniettare le tue dipendenze (incluse le istanze di DbContext) nei costruttori delle tue istanze Controller usando un framework DI come AutoFac o Unity o NInject (l'elenco potrebbe continuare). Ciò rende anche molto più semplice il test delle unità.

+1

Grazie mille. Questo è molto più utile per me..Grazie –

+0

ho provato questo 'var result = prodController.Index() come ViewResult;' sta ancora ottenendo risultati nulli? qualche indizio? – Neo

+1

@Neo - Non senza vedere l'istruzione return nel metodo 'Index'. Consiglierei di fare una nuova domanda su [so] invece di provare a risolverlo nei commenti però. – Igor