/ / ASP.Net MVC: la valeur des annotations de données du modèle du composant système ne peut pas être nulle - asp.net-mvc, unit-testing, data-annotations, vs-unit-testing-framework

ASP.Net MVC: la valeur des annotations de données du modèle du composant système ne peut pas être nulle - asp.net-mvc, unit-testing, data-annotations, vs-unit-testing-framework

quand je fais un test unitaire de ma logique de validation personnalisée, je reçois cette erreur

Une exception de type "System.ArgumentNullException" s'est produite dans System.ComponentModel.DataAnnotations.dll mais n'a pas été géré par l'utilisateur code

Informations complémentaires: La valeur ne peut pas être null.

voici mon code complet. alors s'il vous plaît, voyez-moi et dites-moi où j'ai fait l'erreur?

Mon code modèle

public class DateValTest
{
[Display(Name = "Start Date")]
[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? StartDate { get; set; }

[Display(Name = "End Date")]
[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
[MyDate(ErrorMessage = "Back date entry not allowed")]
[DateGreaterThanAttribute(otherPropertyName = "StartDate", ErrorMessage = "End date must be greater than start date")]
public DateTime?  EndDate { get; set; }
}

voici mon code de validation personnalisé

public class MyDateAttribute : ValidationAttribute, IClientValidatable
{
public DateTime _MinDate;

public MyDateAttribute()
{
_MinDate = DateTime.Today;
}

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
DateTime _EndDat = DateTime.Parse(value.ToString(), CultureInfo.InvariantCulture);
DateTime _CurDate = DateTime.Today;

int cmp = _EndDat.CompareTo(_CurDate);
if (cmp > 0)
{
// date1 is greater means date1 is comes after date2
return ValidationResult.Success;
}
else if (cmp < 0)
{
// date2 is greater means date1 is comes after date1
return new ValidationResult(ErrorMessage);
}
else
{
// date1 is same as date2
return ValidationResult.Success;
}
}

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "restrictbackdates",
};
rule.ValidationParameters.Add("mindate", _MinDate);
yield return rule;
}
}

mon code de test unitaire qui génère une erreur

[TestClass]
public class MyDateAttribute_Test
{
[TestMethod]
[ExpectedException(typeof(ValidationException))]
public void Test_EndDateIsInvalidIFBackDate()
{
var validationResults = new List<ValidationResult>();
DateValTest model = new DateValTest() { EndDate = DateTime.Today.AddDays(10) };
ValidationContext context = new ValidationContext(model);
Validator.TryValidateProperty(model, context, validationResults);
Assert.IsTrue(validationResults.Count > 0);
}
}

mettre en évidence la zone où j'ai fait l'erreur. Merci

Réponses:

0 pour la réponse № 1

Je le résous de cette façon.

[TestMethod]
//[ExpectedException(typeof(ValidationException))]
public void Test_EndDateIsInvalidIFBackDate()
{
var validationResults = new List<ValidationResult>();
DateValTest model = new DateValTest() { StartDate = DateTime.Today, EndDate = DateTime.Today.AddDays(10) };
ValidationContext context = new ValidationContext(model);
MyDateAttribute attribute = new MyDateAttribute();
//attribute.Validate(model.EndDate, context);
Validator.TryValidateObject(model, context, validationResults, true);
//Assert.IsFalse(validationResults.Count > 0);
Assert.AreEqual(false, (validationResults.Count > 0), "Test Equalateral");
//Assert.IsTrue(validationResults.Any(vr => vr.ErrorMessage == "Back date entry not allowed"));
}