3

前の質問に対する 2 番目の回答を実装しようとすると、エラーが発生します。

投稿が示すようにメソッドを実装しましたが、最初の 3 つは適切に機能します。4 つ目 (HomeController_Delete_Action_Handler_Should_Redirect_If_Model_Successfully_Delete) は、次のエラーを返します: 結果の Values コレクションに「コントローラー」という名前のパラメーターが見つかりませんでした。

コードを次のように変更すると:

actual 
    .AssertActionRedirect() 
    .ToAction("Index");

適切に動作しますが、そこにある「魔法の文字列」が好きではなく、他のポスターが使用したラムダメソッドを使用することを好みます。

私のコントローラーメソッドは次のようになります。

    [HttpPost]
    public ActionResult Delete(State model)
    {
        try
        {
            if( model == null )
            {
                return View( model );
            }

            _stateService.Delete( model );

            return RedirectToAction("Index");
        }
        catch
        {
            return View( model );
        }
    }

私は何を間違っていますか?

4

1 に答える 1

9

MVCContrib.TestHelperDeleteアクションでリダイレクトするときにコントローラー名を指定する必要があります。

return RedirectToAction("Index", "Home");

そうすれば、強く型付けされたアサーションを使用できるようになります。

actual
    .AssertActionRedirect()
    .ToAction<HomeController>(c => c.Index());

もう1つの方法は、独自のToActionCustom拡張メソッドを作成することです。

public static class TestHelperExtensions
{
    public static RedirectToRouteResult ToActionCustom<TController>(
        this RedirectToRouteResult result, 
        Expression<Action<TController>> action
    ) where TController : IController
    {
        var body = (MethodCallExpression)action.Body;
        var name = body.Method.Name;
        return result.ToAction(name);
    }
}

これにより、リダイレクトをそのままにしておくことができます。

return RedirectToAction("Index");

次のように結果をテストします。

actual
    .AssertActionRedirect()
    .ToActionCustom<HomeController>(c => c.Index());
于 2010-06-05T06:21:30.150 に答える