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を使用すると、この単体テストをより洗練された方法で記述できます (にキャストする必要さえありません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 に答える