6

私の Asp.net MVC アプリでは、コントローラーに 2 つのメソッドがあります。1 つはユーザーが最初にビューに到着したとき、もう 1 つはビューでフォームを送信したときです。

public ActionResult Foo() {}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Foo(string id, Account accountToFoo) {}

2 番目のアクションには、私が操作しているアカウント オブジェクトを組み立てるカスタム モデル バインダーがありますが、これは実際には重要ではありません。これはすべて、サーバー上でローカルにテストする際にうまく機能します。

HTTP POST のビューを含め、さまざまなビューが適切にルーティングされていることをテストするための単体テストを作成することについては、かなりうまくいくように努めています。そのために、mvccontrib のテスト ヘルパーを使用してきました。

取得のテストは非常に簡単です

"~/account/foo/myusername".
       Route().
       ShouldMapTo<AccountController>(c => c.Foo("myusername"));

私の質問は、POST ルートのテストです。上記の GET テストと同様に、ポストが正確な値を受け取っていることを確認するために使用するラムダをどのように記述すればよいですか?

POST の場合、次のようになります。

"~/account/foo".
         WithMethod(HttpVerbs.Post).
         ShouldMapTo<AccountController>(a => something_something);

私が問題を抱えているのは、ラムダの something_something 部分です。任意の値を使用しても機能しません ("a => a.Foo(0, new Account()")。テストの一部として期待される値を指定するにはどうすればよいですか?

編集 Moq が foo.Setup(s => s.Foo(It.IsAny(), It.Is(i => i > 32)) などのステートメントのラムダを持つ方法に似たものがあることを望んでいました値を明示的に指定する必要がありますが、それは実行可能です-明示的な値を渡すために必要な構造を理解できないようです。

4

2 に答える 2

15

これが例です。次のアクションがあると仮定します。

public AccountController : Controller
{
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Foo(string id) 
    {
        return View();
    }
}

そして、次のルートが登録されました:

RouteTable.Routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "home", action = "index", id = "" }
);

次のようにテストできます。

var routeData = "~/account/foo".WithMethod(HttpVerbs.Post);
routeData.Values["id"] = "123";
routeData.ShouldMapTo<AccountController>(c => c.Foo("123"));

Account2 番目の引数を含めるには、微調整が必​​要になる場合があります。

于 2010-02-02T10:17:06.143 に答える
2

mvccontrib ヘルパー構文の使用:

"~/account/foo".WithMethod(HttpVerbs.Post).ShouldMapTo<AccountController>(a => a.foo(null));

Foo(string id, Account accountToFoo) メソッドはルーティング テストの一部として実行されないため、null を渡します。

于 2010-02-10T14:44:22.837 に答える