2016-04-27 13 views
8

Auch wenn es einige Beiträge auf Stackoverflow über Unit Testing Aktion in MVC Ergebnis, ich habe eine spezifische Frage ....Unit Testing in Viewresult Asp.NET MVC

Hier ist meine Action in Controller:

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

Jeder Artikel in Produkte hat verschiedene Attribute wie Name, Foto, Quantität etc .. ich schrieb eine Prüfmethode für diese Methode .Es sieht wie folgt aus:

private CartEntity db = new CartEntity(); 

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

    ViewResult = prodController.Index(); 


} 

Was sollte ich in diesem Fall vergleichen, da keine Parameter in die Indexaktion

+0

Laut Ihrem Code 'Index()' gibt 'ViewResult' und kein' RedirectToRouteResult' zurück, so dass ich verwirrt bin, sowohl hinsichtlich Ihres Unit-Testcodes als auch Ihrer Frage. – Igor

+0

Hey @Igor, Thanks ..Mein tatsächlicher Code ist falsch –

+1

'Assert.IsInstanceOfType (result, typeof (RedirectToRouteResult));' wird immer noch nach Ihrem neuesten Update fehlschlagen. 'Index' gibt immer noch ein' ViewResult' zurück – Igor

Antwort

8

übergeben werden. Schauen Sie sich die Klasse ViewResult an. Hier können Sie sehen, was Sie sonst noch testen könnten. Was Sie tun müssen, ist Mock your DbContext und liefern Sie mit Daten in der Products Eigenschaft (DbSet<>), wie dies in Ihrem Controller Aktion aufgerufen wird. Sie können dann testen

  1. Der Typ
  2. Das Modell auf der Viewresult
  3. Der Viewname zurückgegeben wird, die

Beispielcode

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

leer oder Index sein sollte

Wenn du ne bist Um einen DbContext zu verspotten gibt es bestehende Frameworks und Artikel zu diesem Thema. Hier ist eine von Microsoft mit dem Titel Testing with a mocking framework. Idealerweise sollten Sie Ihre Abhängigkeiten (einschließlich DbContext-Instanzen) in die Konstruktoren Ihrer Controller-Instanzen einfügen, indem Sie ein DI-Framework wie AutoFac oder Unity oder NInject verwenden (die Liste wird fortgesetzt). Dies erleichtert auch die Stückprüfung erheblich.

+1

Vielen Dank. Das ist viel hilfreicher für mich..Vielen Dank –

+0

Ich habe versucht, diese 'var result = prodController.Index() als ViewResult;' immer noch null Ergebnis? irgendeine Ahnung? – Neo

+1

@Neo - Nicht ohne die Return-Anweisung in Ihrer 'Index'-Methode zu sehen. Ich würde empfehlen, eine neue Frage zu [so] zu stellen, anstatt zu versuchen, sie in den Kommentaren zu lösen. – Igor