Модульное тестирование проверки MVC5 с защитой от дурака — исключение NotImplemented

Я выполняю модульное тестирование своей логики проверки в 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);
    }
}

Одна из моих моделей данных содержит следующее:

[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; }

Это вызывает исключение NotImplementedException из Foolproof с этой трассировкой стека:

   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, чтобы гарантировать, что изменения не будут иметь далеко идущих последствий по мере роста проекта.

Любые советы о том, как заставить это работать, очень ценятся.


person Martin Noreke    schedule 18.06.2015    source источник
comment
Похоже, у вас есть две разные версии Foolproof, на которые вы ссылаетесь. Найдите каждую копию dll и проверьте ее. Используйте ведение журнала слияния, если вы не найдете несоответствующих версий.   -  person    schedule 18.06.2015
comment
Я только что убедился, что все мои проекты (ViewModel, MVC, MVCTest) ссылаются на одну и ту же версию Foolproof.   -  person Martin Noreke    schedule 18.06.2015
comment
Как? Находя каждую копию на диске и используя декомпилятор для ее проверки? Используя ведение журнала Fusion, чтобы увидеть, где он загружается? Это то, что вам нужно делать, когда у вас происходит что-то причудливое. Начните снизу.   -  person    schedule 18.06.2015
comment
Я проверил номер версии через VS. Я также удалил все свои папки bin, чтобы перед запуском теста на диске существовал только один файл MVC Foolproof Validation.dll, и он все еще терпит неудачу. Отлично работает в MVC.   -  person Martin Noreke    schedule 18.06.2015
comment
Отлично работает в MVC, что это значит? Работает во время выполнения? На той же машине или где-то на сервере?   -  person    schedule 18.06.2015
comment
Работает во время выполнения на нескольких компьютерах или в Azure.   -  person Martin Noreke    schedule 18.06.2015
comment
Итак, на лазурном веб-сайте все работает нормально. А локально не запускается? Тогда версия, публикуемая в Azure, является правильной версией. У вас должна быть другая версия на машине, где она не работает. Вам нужно использовать ведение журнала слияния, чтобы увидеть, откуда загружается сборка. Перейдите на msdn и найдите документы по ведению журнала Fusion. Настройте его, перезагрузите и снова запустите неудачные тесты. Посмотрите в журналах надежную dll.   -  person    schedule 18.06.2015


Ответы (1)


В итоге я скачал код Foolproof с Codeplex, чтобы покопаться в этом.

public override bool IsValid(object value)
{
    throw new NotImplementedException();
}

Вызываемый метод проверки не реализован. Вместо этого я свяжусь с их досками объявлений, чтобы узнать, как решить эту проблему.

person Martin Noreke    schedule 18.06.2015