2

RedirectToAction メソッドを使用して、ユーザーが登録フォームに入力し、すべての検証に合格した後、ユーザーを別のフォームにリダイレクトしています。唯一の問題は、コントローラーのテスト中に発生します。ユーザーが必要なフォームに正常にリダイレクトされたことをどのようにテストすればよいですか?

コントローラー:

[HttpPost]
public ActionResult Register(ClientViewModel clientViewModel)
{ 
    if (ModelState.IsValid)
    {
       //filling db object 
                if (license.HasValue)
                {
                    return RedirectToAction("RegisterSuccess");
                } 
    }
    return View(clientViewModel);
}

テスト方法:

public void Register_WithUniqueUsernameAndEmail_ReturnsRegistrationSuccessful()
{
    // Arrange:
    var mock = new Mock<IAccountFacade>();
    mock.Setup(/*mocking methods*/);
    var controller = new AccountController(mock.Object);
    var context = new ControllerContext();
    var fakeClientViewModel = new ClientViewModel

    // Act:
    var result = controller.Register(fakeClientViewModel);
    // how do I get the name of result or something similar?

    // Assert: ???
}

テストには Moq と Nunit を使用しています。コントローラーがビューを返しただけなら問題ないと思いますが、RedirectToAction メソッドでは、リダイレクト フォームの実際の URL またはルートにアクセスする方法が見つかりません。助言がありますか?

4

2 に答える 2

1

result変数を によって返される型にキャストする必要がRedirectToActionありますRedirectToRouteResult。次に、次のように単体テストできます。

var result = (RedirectToRouteResult)controller.Register(fakeClientViewModel);

Assert.AreEqual("ExpectedActionName", result.RouteValues["action"]);
Assert.AreEqual("ExpectedControllerName", result.RouteValues["controller"]);
于 2013-06-23T17:17:18.490 に答える
0

あなたの例はコントローラ/アクションを反映していませんが、テストアサーションは次のようになります:

// act
var result = someController.SomeAction() as RedirectToRouteResult;

// assert
Assert.AreEqual("ExpectedRoute", result.RouteValues["action"]);
Assert.AreEqual("ExpectedController", result.RouteValues["controller"]);
于 2013-06-23T17:17:44.087 に答える