MVC框架如何首先使用DataAnnotations验证代码POCO?

时间:2012-09-20 09:44:11

标签: c# asp.net-mvc unit-testing code-first

在我的单元测试中,我想强制验证代码第一个POCO,它上面有DataAnnotations。

MVC框架必须在幕后进行,基本上我想知道如何,所以我希望能够使用它。

2 个答案:

答案 0 :(得分: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对视图模型执行验证。它integrates nicely with ASP.NET MVC,它允许您以非常优雅的方式unit test your validators

答案 1 :(得分:0)

我只是answered a similar question

我通常通过直接调用System.ComponentModel.DataAnnotations.Validator的facade方法对我的模型验证设置进行单元测试。

我写了一篇关于这个主题的文章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"
    };
    /* ... */
}

我不喜欢信任代码才能正常工作,所以我系统地为我的模型验证代码编写单元测试。但是,我确实相信框架/模型绑定器可以执行验证。 这个单元测试允许我编写信任验证的控制器。