Как издеваться над ModelState.Допустимым использованием фреймворка Moq как?
Я проверяю ModelState.IsValid
в моем методе действия контроллера, который создает сотрудника следующим образом:
[HttpPost]
public virtual ActionResult Create(EmployeeForm employeeForm)
{
if (this.ModelState.IsValid)
{
IEmployee employee = this._uiFactoryInstance.Map(employeeForm);
employee.Save();
}
// Etc.
}
Я хочу издеваться над ним в моем методе модульного тестирования с использованием Moq Framework. Я попытался высмеять его так:
var modelState = new Mock<ModelStateDictionary>();
modelState.Setup(m => m.IsValid).Returns(true);
но это вызывает исключение в моем единичном тестовом случае. Кто-нибудь может мне помочь?
3 ответа:
вам не нужно издеваться над ним. Если у вас уже есть контроллер, вы можете добавить ошибку состояния модели при инициализации теста:
// arrange _controllerUnderTest.ModelState.AddModelError("key", "error message"); // act // Now call the controller action and it will // enter the (!ModelState.IsValid) condition var actual = _controllerUnderTest.Index();
единственная проблема, которую я имею с решением выше, заключается в том, что он фактически не тестирует модель, если я устанавливаю атрибуты. Я настраиваю свой контроллер таким образом.
private HomeController GenerateController(object model) { HomeController controller = new HomeController() { RoleService = new MockRoleService(), MembershipService = new MockMembershipService() }; MvcMockHelpers.SetFakeAuthenticatedControllerContext(controller); // bind errors modelstate to the controller var modelBinder = new ModelBindingContext() { ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType()), ValueProvider = new NameValueCollectionValueProvider(new NameValueCollection(), CultureInfo.InvariantCulture) }; var binder = new DefaultModelBinder().BindModel(new ControllerContext(), modelBinder); controller.ModelState.Clear(); controller.ModelState.Merge(modelBinder.ModelState); return controller; }
объект modelBinder-это объект, который проверяет правильность модели. Таким образом, я могу просто установить значения объекта и проверить его.