31

次のようなコントローラーの単体テストを作成しています。

public HttpResponseMessage PostLogin(LoginModel model)
{
    if (!ModelState.IsValid)
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
}

モデルは次のようになります。

public class LoginModel
{
    [Required]
    public string Username { set; get; }
    [Required]
    public string Password { set; get; }
}

次に、次のような単体テストがあります。

[TestMethod]
public void TestLogin_InvalidModel()
{
    AccountController controller = CreateAccountController();

    ...
    var response = controller.PostLogin(new LoginModel() {  });

    Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);

}

実際には ModelState が検証されています...両方のフィールドが必要なので、これは私にとって奇妙です...誰かアドバイスできますか?

4

5 に答える 5

31

モデル状態が有効である理由は、コントローラーを新規作成すると新しいモデル状態が作成されるためです。ここでは、Web API はパラメーター バインディングを行っていないため、モデル状態エラーを追加する機会さえありません。

これを単体テストとして保持する場合は、モデル状態エラーを自分で追加して、何が起こるかをテストする必要があります。

実際のリクエストでモデルの状態が無効になることをテストしたい場合は、次のブログ投稿を読むことをお勧めします。

http://blogs.msdn.com/b/youssefm/archive/2013/01/28/writing-tests-for-an-asp-net-webapi-service.aspx

インメモリサーバーに対してテストしてみてください。Web API がボディを適切に逆シリアル化してバインドしようとすることを確認するために、リクエストで ObjectContent の代わりに StringContent を使用することをお勧めします。

于 2013-06-27T16:56:09.750 に答える
30

TL;DR Youssef が提供する記事全体を読みたくなく、ModelState.IsValid が false を返すようにする方法の簡単な解決策が必要な場合。これを行う。

[TestMethod]
public void TestLogin_InvalidModel()
{
    AccountController controller = CreateAccountController();
    // new code added -->
    controller.ModelState.AddModelError("fakeError", "fakeError");
    // end of new code
    ...
    var response = controller.PostLogin(new LoginModel() {  });

    Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);

}

今、私は CreateAccountController() が最小でこのように見えると想像できます->

return new AccountApiController()
{
    Request = new HttpRequestMessage(),
    Configuration = new HttpConfiguration()
};

これがそれらのグーグルに簡単な答えを与えることを願っています:)

于 2015-06-12T09:48:56.060 に答える