it-swarm.com.de

Wie teste ich eine Aktion?

Ich habe Unit-Test für folgende Aktion geschrieben.

[HttpPost]
public ActionResult/*ViewResult*/ Create(MyViewModel vm)
{
    if (ModelState.IsValid)
    {
        //Do something...
        return RedirectToAction("Index");
    }

    return View(vm);
}

Die Testmethode kann nur auf Model-Eigenschaften zugreifen, wenn der Rückgabetyp ViewResult ist. Im obigen Code habe ich RedirectToAction verwendet, so dass der Rückgabetyp dieser Aktion nicht ViewResult sein kann. 

Wie testen Sie in einem solchen Szenario eine Aktion?

32
Abhijeet

Hier ist mein kleines Beispiel:

public ActionResult Index(int id)
{
  if (1 != id)
  {
    return RedirectToAction("asd");
  }
  return View();
}

Und die Tests:

[TestMethod]
public void TestMethod1()
{
  HomeController homeController = new HomeController();
  ActionResult result = homeController.Index(10);
  Assert.IsInstanceOfType(result,typeof(RedirectToRouteResult));
  RedirectToRouteResult routeResult = result as RedirectToRouteResult;
  Assert.AreEqual(routeResult.RouteValues["action"], "asd");
}

[TestMethod]
public void TestMethod2()
{
  HomeController homeController = new HomeController();
  ActionResult result = homeController.Index(1);
  Assert.IsInstanceOfType(result, typeof(ViewResult));
}

Bearbeiten:
Nachdem Sie sich vergewissert haben, dass der Ergebnistyp ViewResut ist, können Sie dies tun:

ViewResult vResult = result as ViewResult;
if(vResult != null)
{
  Assert.IsInstanceOfType(vResult.Model, typeof(YourModelType));
  YourModelType model = vResult.Model as YourModelType;
  if(model != null)
  {
    //...
  }
}
64
Péter

Bitte beachte, dass 

Assert.IsInstanceOfType(result,typeof(RedirectToRouteResult)); 

wurde nicht mehr empfohlen.

Die neue Syntax lautet

Assert.That(result, Is.InstanceOf<RedirectToRouteResult>());
9
Esteban Chi

Versuchen Sie diesen Code:

dynamic result=objectController.Index();
Assert.AreEqual("Index",result.ViewName);
0
ANKIT SINGH