4

私の単体テストでは、DataAnnotationsが含まれているコードファーストPOCOの検証を強制したいと思います。

MVCフレームワークは舞台裏でそれを行っているに違いありませんが、基本的にはその方法を知りたいので、うまくいけばそれを利用することができます。

4

2 に答える 2

5

MVCフレームワークは舞台裏でそれを実行しているので、基本的にはその方法を知りたいので、うまくいけばそれを利用することができます。

リクエスト値からモデルをバインドした後、モデルの検証を呼び出すのは、デフォルトのモデルバインダーです。

を使用して、検証プロセスを手動で呼び出すことができますValidationContext

モデルがあるとしましょう。

public class Foo
{
    [Required(ErrorMessage = "the Bar is absolutely required")]
    public string Bar { get; set; }
}

そして、それをユニットテストすることができます:

[TestMethod]
public void The_Bar_Is_Required()
{
    // arrange
    var foo = new Foo();
    var results = new List<ValidationResult>();
    var context = new ValidationContext(foo, null, null);

    // act
    var actual = Validator.TryValidateObject(foo, context, results);

    // assert
    Assert.IsFalse(actual);
}

DataAnnotationsを使用する代わりに、FluentValidation.NETを使用てビューモデルの検証を実行することもできます。ASP.NET MVCとうまく統合され、非常にエレガントな方法でバリデーターの単体テストを行うことができます。

于 2012-09-20T09:56:21.447 に答える
0

私はちょうど同様の質問に答えました

私は通常、System.ComponentModel.DataAnnotations.Validatorのファサードメソッドを直接呼び出すことにより、モデル検証セットアップを単体テストします。

このテーマに関する記事を書きましたhttp://timoch.com/blog/2013/06/unit-testing-model-validation-with-mvcs-dataannotations/

私はこのようなコードになります(この記事は、モデル検証のためのよりクリーンで再利用可能な単体テストの基本クラスを示しています)

[Test]
[TestCaseSource("ValidationRule_Source")]
public void ValidationRule(ValidateRuleSpec spec) {
    // Arrange
    var model = CreateValidPersonModel();
    // Apply bad valud
    model.GetType().GetProperty(spec.MemberName).SetValue(model, spec.BadValue);

    // Act
    var validationResults = new List<ValidationResult>();
    var success = Validator.TryValidateObject(model, new ValidationContext(model), validationResults, true);

    // Assert
    Expect(success, False);
    Expect(validationResults.Count, EqualTo(1));
    Expect(validationResults.SingleOrDefault(r => r.MemberNames.Contains(spec.MemberName)), Not.Null);
}

public IEnumerable<ValidateRuleSpec> ValidationRule_Source() {
    yield return new ValidateRuleSpec() {
        BadValue = null,
        MemberName = "FirstName"
    };
    yield return new ValidateRuleSpec() {
        BadValue = string.Empty,
        MemberName = "FirstName"
    };
    yield return new ValidateRuleSpec() {
        BadValue = null,
        MemberName = "LastName"
    };
    /* ... */
}

コードが機能することを信頼するのは好きではないので、モデル検証コードの単体テストを体系的に記述します。ただし、検証を実行するためにフレームワーク/モデルバインダーを信頼しています。この単体テストにより、検証がOKであると信頼するコントローラーを作成できます。

于 2013-06-21T09:21:45.907 に答える