使用asp.net mvc中的单元测试验证重定向

Ale*_*imp 14 asp.net-mvc unit-testing

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

控制器代码:

public ActionResult Create(ProductModel newProduct)
{
    this.repository.CreateProduct(newProduct);
    return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)

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

ProductController controller = new ProductController(repository);

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

bool redirected = checkGoesHere;
Assert.True(redirected, "Should have redirected to 'Index'");
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rov 25

当然:

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

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

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

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

// assert
result
    .AssertActionRedirect()
    .ToAction("Index");
Run Code Online (Sandbox Code Playgroud)


Anu*_*rag 11

试试这个...

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

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

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

希望这可以帮助 :)