次のヘルパー メソッドを使用して、MVC で検証ロジックの単体テストを行っています。
public static void ValidateViewModel(Controller controller, object viewModelToValidate)
{
var validationContext = new ValidationContext(viewModelToValidate, null, null);
var validationResults = new List<ValidationResult>();
Validator.TryValidateObject(viewModelToValidate, validationContext, validationResults, true);
foreach (var validationResult in validationResults)
{
controller.ModelState.AddModelError(validationResult.MemberNames.FirstOrDefault() ?? string.Empty, validationResult.ErrorMessage);
}
}
私のデータモデルの1つには、次のものが含まれています。
[NotMapped]
public string ValidSignupCode { get { return "VALID_SIGNUP_CODE"; } }
[MaxLength(15)]
[EqualTo("ValidSignupCode", ErrorMessage = "Sign up Code is not valid.")]
public string SignupCode { get; set; }
これは、このスタックトレースで Foolproof から NotImplementedException をスローします。
at Foolproof.ModelAwareValidationAttribute.IsValid(Object value)
at System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(Object value, ValidationContext validationContext)
at System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult(Object value, ValidationContext validationContext)
at System.ComponentModel.DataAnnotations.Validator.TryValidate(Object value, ValidationContext validationContext, ValidationAttribute attribute, ValidationError& validationError)
at System.ComponentModel.DataAnnotations.Validator.GetValidationErrors(Object value, ValidationContext validationContext, IEnumerable`1 attributes, Boolean breakOnFirstError)
at System.ComponentModel.DataAnnotations.Validator.GetObjectPropertyValidationErrors(Object instance, ValidationContext validationContext, Boolean validateAllProperties, Boolean breakOnFirstError)
at System.ComponentModel.DataAnnotations.Validator.GetObjectValidationErrors(Object instance, ValidationContext validationContext, Boolean validateAllProperties, Boolean breakOnFirstError)
at System.ComponentModel.DataAnnotations.Validator.TryValidateObject(Object instance, ValidationContext validationContext, ICollection`1 validationResults, Boolean validateAllProperties)
興味深いことに、これは MVC を実行している場合は正常に動作しますが、UnitTest ランドでは動作しません。
私の目標は、MVC インターフェースを介して検証とバインディングを単体テストし、プロジェクトが大きくなるにつれて変更が影響を及ぼさないようにすることです。
これを機能させる方法についてのアドバイスは大歓迎です。