1

コントローラーの return ステートメントは次のとおりです。

var url = Url.Action("method", "controller", new { id = id }) + "#anchor-tag";
return new RedirectResult(url);

したがって、私のテスト メソッドでは、コントローラーの (sut) UrlHelper を割り当てて、null 参照例外が発生しないようにする必要があります。FakeItEasy を使用して HttpContext をモックしています。

sut.Url = new UrlHelper(new RequestContext(A.Fake<HttpContextBase>(), new RouteData()), new RouteCollection());

これは正常に動作しているようですが、コントローラーのアクション メソッドが正しいメソッドとコントローラーにリダイレクトされたことを証明したい場合:

var redirectResult = sut.DoSomething(input);

コントローラー アクションが RedirectToRouteResult を返すときのように、RouteValues を抽出できません。別名:

Assert.That(redirectResult.RouteValues["id"], Is.EqualTo(Id));

b/c RedirectResult では、これらの変数にアクセスできません。また、キャストしようとすると:

var redirectResult = (RedirectToRouteResult)sut.DoSomething(input);

キャスト エラーが発生します。

コントローラーが適切な場所にリダイレクトされていることをテストできるようにする必要がありますが、それはできません b/c Url.Action(...) は RouteData、RouteCollection などの他のアイテムと内部的に連携する必要があります...

ControllerContext を使用して、テストで必要な「ルート」データを事前設定する方法を誰でも知っています。

sut.ControllerContext = new ControllerContext(requestContext, sut);

テストで Url.Action に正しい値を吐き出すにはどうすればよいですか?

ありがとう!マイク

4

1 に答える 1

2

あなたの質問を正しく理解できたら、RedirectResult を返すことで返される URL をテストしてください。

次のようなことが簡単にできます。

var result = (RedirectResult)aec.Result;

そして、 result.Url.AbsoluteURI には、解析できる文字列値が含まれています

于 2014-02-27T00:38:20.713 に答える