2010-12-19 5 views
4

Ich habe eine Action wie folgt:Wie kann ich eine MVC-Aktion testen, die ein PartialViewResult zurückgibt?

public PartialViewResult MyActionIWantToTest(string someParameter) 
{ 
    // ... A bunch of logic 
    return PartialView("ViewName", viewModel); 
} 

Wenn ich das Ergebnis überprüfen, es ein paar Eigenschaften, aber sie sind entweder null oder leer. Die einzige Eigenschaft, die etwas hat, ist die ViewEngineCollection, die nichts spezifisch für meine Methode enthält.

Hat jemand einen Beispielcode, der eine PartialViewResult testet?

Antwort

8

Sagen Sie bitte eine Action haben, die etwa wie folgt aussieht:

public PartialViewResult MyActionIWantToTest(string someParameter) 
{ 
    var viewModel = new MyPartialViewModel { SomeValue = someParameter }; 
    return PartialView("MyPartialView", viewModel); 
} 

Hinweis: MyPartialViewModel ist eine einfache Klasse mit nur einer Eigenschaft - SomeValue.

Ein NUnit Beispiel kann wie folgt aussehen:

[Test] 
public void MyActionIWantToTestReturnsPartialViewResult() 
{ 
    // Arrange 
    const string myTestValue = "Some value"; 
    var ctrl = new StringController(); 

    // Act 
    var result = ctrl.MyActionIWantToTest(myTestValue); 

    // Assert 
    Assert.AreEqual("MyPartialView", result.ViewName); 
    Assert.IsInstanceOf<MyPartialViewModel>(result.ViewData.Model); 
    Assert.AreEqual(myTestValue, ((MyPartialViewModel)result.ViewData.Model).SomeValue); 
} 
+0

Auch MvcContrib.Testhelper verfügt über eine AssertPartialViewRendered() - Erweiterungsmethode. – mxmissile

+0

Wow - danke, ich kann nicht glauben, dass ich das verpasst habe! – Robert

1

Die akzeptierte Antwort nicht für mich arbeiten. Ich habe Folgendes getan, um den Testfehler zu beheben, den ich sah.

Dies war meine Aktion:

[Route("All")] 
    public ActionResult All() 
    { 
     return PartialView("_StatusFilter",MyAPI.Status.GetAllStatuses()); 
    } 

ich das Ergebnis eine Art, um es zu geben, musste zu arbeiten. Ich habe PartialViewResult für meine Aktion verwendet, die eine Teilansicht zurückgibt, im Gegensatz zu meinen anderen Aktionen, die eine vollständige Ansicht zurückgeben und View-Ergebnis verwenden. Dies ist meine Testmethode:

[TestMethod] 
public void All_ShouldReturnPartialViewCalledStatusFilter() 
{ 
    // Arrange 
    var controller = new StatusController(); 
    // Act 
    var result = controller.StatusFilter() as PartialViewResult; 
    // Assert 
    Assert.AreEqual("_StatusFilter", result.ViewName, "All action on Status Filter controller did not return a partial view called _StatusFilter."); 
    }