2013-08-09 2 views
3

Я начинаю изучать модульные испытания в MVC4.Тестирование блока управления с подтверждением модели

Это мой контроллер.

public class AccountController : Controller 
{ 
    public ActionResult Register(User user) 
    { 
     if (ModelState.IsValid) 
     { 
      return View("RegistrationSuccessful");     
     } 
     return View("Register"); 
    } 
} 

И это испытание.

public class AccountControllerTests 
{ 
    [TestMethod] 
    public void invalid_registration_details_should_show_registration_form_again() 
    { 
     var controller = new AccountController(); 
     var user = new User(); 
     user.Name = null; 
     var result = controller.Register(user) as ViewResult; 
     Assert.AreEqual("Register", result.ViewName); 
    } 
} 

И это модель.

public class User 
{ 
    [Required] 
    public string Name { get; set; } 
} 

Когда я называю controller.Register (пользователь) Я думаю, что модель связующий не приходит к картине, как я инстанцирование контроллеру самого, а не через рамку. Поэтому я думаю, что ModelState.IsValid будет истинным по умолчанию.

Как это проверить? Как можно моделировать валидацию в модульных тестах?

ответ

0

Я не уверен, что можно инициировать проверку модели, но я знаю, как ее проверить.

Попробуйте этот код:

[TestClass] 
    public class AccountControllerTests 
    { 
     [TestMethod] 
     public void invalid_registration_details_should_show_registration_form_again() 
     { 
      // arrange 
      var controller = new AccountController(); 
      controller.ViewData.ModelState.AddModelError("Key", "ErrorMessage"); 

      // act 
      var result = controller.Register(new User()) as ViewResult; 

      // assert 
      Assert.AreEqual("Register", result.ViewName); 
     } 

     [TestMethod] 
     public void valid_registration_details_should_show_registration_successful_page() 
     { 
      // arrange 
      var controller = new AccountController(); 

      // act 
      var result = controller.Register(new User()) as ViewResult; 

      // assert 
      Assert.AreEqual("RegistrationSuccessful", result.ViewName); 
     } 
    } 
0

Вы можете сделать это, заставляя его проверить свою модель, вызвав вытекающий из теста. Для моих тестов я создал класс TestHelper, внутри которого издевались над этим методом и добавлены ModelState.AddModelError() для определенных условий.

TryValidateModel(model);// will do the task 

Может быть вам нужно дразнить ControllerContext, а для этого.

1

Вы также можете достичь подхода ниже, чтобы проверить модель. В моем случае ниже ProjectViewModel - моя модель. В приведенном ниже сценарии я не задал свойство Description для проверки работоспособности проверки.

[TestMethod] 
[ExpectedException(typeof(ValidationException), "Please enter description.")] 
public void Create_Project_Empty_Description() 
{ 
    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" } } 
    }; 

    ValidationContext contex = new ValidationContext(model); 
    Validator.ValidateObject(model, contex); 
} 
+0

Вот еще один вариант. http://stackoverflow.com/questions/2167811/unit-testing-asp-net-dataannotations-validation – pwDev

1

Поскольку нет никакой логики в контроллере, кроме проверки, если ModelState.IsValid == правда, я думаю, вы можете просто хочу, модульное тестирование для вашей модели.

Во-первых, ваша модель. Я бы изменил его, чтобы выглядеть примерно так:

public class User : IValidatableObject 
{ 
    public string Name { get; set; } 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     // I personally add all my validation here instead of adding [Required] to specific properties, this helps me know all of my validation is in this one place and add other complex validations if needed 
     // This code here determines if ModelState.IsValid 
     var retVal = new List<ValidationResult>(); 
     if (string.IsNullOrEmpty(this.Name)) 
     { 
      retVal.Add(new ValidationResult("Name is Empty", new List<string> { "Name" })); 
     } 
     return retVal; 
    } 
} 

Во-вторых, единичный тест. Я бы написал тесты, где я ожидал бы определенного сообщения об ошибке для определенного свойства. В этом примере я даю нулевое значение и ожидаю, что сообщение об ошибке «Имя пусто» для свойства «Имя»:

[TestMethod] 
    public void NullOrEmptyName() 
    { 
     var model = new YourProject.Models.Account.User { Name= null }; 
     var validationContext = new ValidationContext(model); 
     var validation = model.Validate(validationContext).ToList(); 
     Assert.AreEqual(validation.Count(x => x.ErrorMessage == "Name is empty" && x.MemberNames.Single() == "Name"), 1); 
    } 
Смежные вопросы