2012-07-15 24 views
13

のユニットテストでリダイレクトを確認するコントローラのアクションが実際に特定のページにリダイレクトされていることを単体テストで簡単に確認する方法はありますか?asp.net mvc

コントローラーコード:

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'"); 

確認の方法はわかりません。何か案は?

答えて

25

確か:

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

、あなたははるかにエレガントな方法(あなたもRedirectToRouteResultにキャストする必要はありません)で、このユニットテストを書くことができMvcContrib.TestHelper使用:

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

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

// assert 
result 
    .AssertActionRedirect() 
    .ToAction("Index"); 
+0

おかげでダーリンを...

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

希望をこのような何かを行うことができます。 –

+0

+1 TestHelperへのリンク –

+0

このMvcContribライブラリは素晴らしいです! – will

11

てみてくださいこれ...

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

リダイレクションでパラメータを渡している場合私はそれがこのような単純なものになるだろう知っていた - uがこのことができます:)