c#中验证属性的单元测试

时间:2015-12-03 10:15:46

标签: c# unit-testing asp.net-web-api data-annotations

我试图使用Validator对c#模型的验证进行单元测试,但它不能使用NewtonSoft属性。有人可以帮我这个吗?

var searchController = new SearchController();
var requestModel = new RequestModel
{
   Id = "23456",
   MobileNumber = "9876543210"
};

var results = new List<ValidationResult>();
var context = new ValidationContext(requestModel, null, null);
var isvalid = Validator.TryValidateObject(requestModel, context, results,true);
Assert.IsFalse(isvalid);

我也上传了我的模型类

public class XYZ
    {
[JsonProperty("mobileNumber")]
        [MinLength(3, ErrorMessage = "MOBILENUMBER_LENGTH_MIN")]
        public string MobileNumber { get; set; }

        [JsonProperty("refNumber")]
        [MinLength(3, ErrorMessage = "REFNUMBER_LENGTH_MIN")]
        public string RefNumber { get; set; }

        [JsonProperty("subscriberFirstName")]
        [MinLength(3, ErrorMessage = "FIRSTNAME_LENGTH_MIN")]
        public string FirstName { get; set; }
}

1 个答案:

答案 0 :(得分:0)

根据 Unit Testing ASP.NET DataAnnotations validation

改编 Jon Davis 的回答

如果您有这样的课程:

public class Person
{
  [MinLength(3, ErrorMessage = "FIRSTNAME_LENGTH_MIN")]
  public string FirstName { get; set; }

  [MinLength(3, ErrorMessage = "MOBILENUMBER_LENGTH_MIN")]
  public string MobileNumber { get; set; }
}

您可以像这样测试验证结果:

[TestMethod]
public void ModelValidationFailsWithInvalidLength()
{
  // arrange
  var myPerson = new Person()
  {
    FirstName = "Hi",
    MobileNumber = "12"
  };

  // act
  var validationResults = ValidateModel(myPerson);

  // assert
  Assert.IsTrue(validationResults.Any(
    v => v.MemberNames.Contains(nameof(Person.FirstName)) &&
         v.ErrorMessage.Contains("FIRSTNAME_LENGTH_MIN")));
}

private IList<ValidationResult> ValidateModel(object model)
{
  var validationResults = new List<ValidationResult>();
  var ctx = new ValidationContext(model, null, null);
  Validator.TryValidateObject(model, ctx, validationResults, true);
  return validationResults;
}