15

是否有一种简单的方法可以在单元测试中验证控制器操作确实重定向到特定页面?

控制器代码:

public ActionResult Create(ProductModel newProduct)
{
    this.repository.CreateProduct(newProduct);
    return RedirectToAction("Index");
}

所以在我的测试中,我需要验证控制器实际上是在重定向。

ProductController controller = new ProductController(repository);

RedirectToRouteResult result = (RedirectToRouteResult)controller.Create(newProduct);

bool redirected = checkGoesHere;
Assert.True(redirected, "Should have redirected to 'Index'");

我只是不确定如何进行验证。有任何想法吗?

4

2 回答 2

26

当然:

Assert.AreEqual("Index", result.RouteValues["action"]);
Assert.IsNull(result.RouteValues["controller"]); // means we redirected to the same controller

并使用MvcContrib.TestHelper您可以以更优雅的方式编写此单元测试(您甚至不需要强制转换为 a RedirectToRouteResult):

// arrange
var sut = new ProductController(repository);

// act
var result = sut.Create(newProduct);

// assert
result
    .AssertActionRedirect()
    .ToAction("Index");
于 2012-07-15T19:47:22.220 回答
11

试试这个...

var result = sut.Create(newProduct) as RedirectToRouteResult;
Assert.Equal(result.RouteValues["action"], "Index");

如果你在重定向中传递一个参数,你可以做这样的事情......

var result = sut.Create(newProduct) as RedirectToRouteResult;
Assert.Equal(result.RouteValues["action"], "Index");
Assert.Equal(result.RouteValues["Parameter Name"], "Parameter Value");

希望这可以帮助 :)

于 2013-12-06T14:12:39.197 回答