1

非常に単純なシナリオであると予想されるものに関する情報を見つけるのに苦労しています。DataAnnotions を使用したカスタム入力モデルを使用する ASP.NET Mvc 2 コントローラーでアクションを単体テストしようとしています。タイトルにあるように、私のテスト フレームワークは xUnit です。

これが私のカスタム入力モデルです:

public class EnterPasswordInputModel
{
    [Required(ErrorMessage = "")]
    public string Username { get; set; }

    [Required(ErrorMessage = "Password is a required field.")]
    public string Password { get; set; }
}

そして、これが私のコントローラーです(この例のために単純化するためにいくつかのロジックを取り出しました):

[HttpPost]
public ActionResult EnterPassword(EnterPasswordInputModel enterPasswordInput)
{
    if (!ModelState.IsValid)
        return View();

    // do some logic to validate input
    // if valid - next View on successful validation
        return View("NextViewName");
    // else - add and display error on current view
        return View();
}

そして、これが私のxUnit Factです(これも簡略化されています):

[Fact]
public void EnterPassword_WithValidInput_ReturnsNextView()
{
    // Arrange
    var controller = CreateLoginController(userService.Object);

    // Act
    var result = controller.EnterPassword(
        new EnterPasswordInputModel
            {
                Username = username, Password = password
            }) as ViewResult;

    // Assert
    Assert.Equal("NextViewName", result.ViewName);
}

テストを実行すると、コントローラーの結果 (Act セクション) を取得しようとすると、テスト ファクトに次のエラーが表示されます。

System.NullReferenceException: Object reference not set to an instance of an object.

あなたが提供できる助けを前もってありがとう!

4

2 に答える 2

1

しかし、私は解決に向けて順調に進んでいると思います。コントローラに加えた変更は次のとおりです。

オリジナル

if (!ModelState.IsValid)
    return View();

更新しました

if (!TryUpdateModel(loginInput))
            return View();

テスト中にモデルのバインドが発生していなかったようです。POSTが発生しない限り、モデルのバインドは行われないようです。試行されたモデルバインディングを強制することで、テストに合格することができました。

:モデルが検証されなかった理由を理解しようとしたときに発生した元のnull参照を引き起こしていた、アクションのエラーもありました。

参照: http: //bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html

于 2010-05-14T14:26:43.853 に答える
0

コントローラアクション内でnullインスタンスを間接参照しています。おそらく、質問を「単純化」するために取り出したコードで。テスト結果のコールスタックを見て、何を理解します。あなたはテストのために何かをあざける必要があるかもしれません。

于 2010-05-14T14:21:31.637 に答える