I created a ViewModel as shown below.
public class ProjectViewModel: IValidatableObject
{
public int ProjectID { get; set; }
[DisplayName("Name")]
[Required]
public string Name { get; set; }
[DisplayName("Start Date")]
public DateTime StartDate { get; set; }
[DisplayName("End Date")]
[Compare("EndDate")]
public DateTime EndDate { get; set; }
[DisplayName("Project States")]
public List<ProjectStateViewModel> States { get; set; }
public string PageTitle { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
List<ValidationResult> res = new List<ValidationResult>();
if (EndDate <= StartDate)
{
res.Add( new ValidationResult(ErrorMessage.END_DATE_AFTER_START_DATE));
}
return res;
}
}
Also written below is a test case
[TestMethod]
[ExpectedException( typeof(ValidationException),"End Date must be greater than Start Date.")]
public void Create_New_Project_EndDate_Earlier_StartDate()
{
ProjectViewModel model = new ProjectViewModel
{
ProjectID = 3,
Name = "Test Project",
StartDate = DateTime.Now.Date,
EndDate = DateTime.Now.AddMonths(-1),
States = new List<ProjectStateViewModel> { new ProjectStateViewModel { StateName = "Pending" } }
};
Task<ActionResult> task = _projectController.Edit(model);
ViewResult result = task.Result as ViewResult;
}
It works fine when the actual code is executed in the MVC application through the browser. But ModelState.IsValid returns true in my Unit test, and it fails. Later I realized that the check is not performed by the controller. The controller received the model after validation, so it will have a corresponding ModelState. My question is what should be my approach to writing Unit test to test the model, or should I write at all?
source
share