Модульное тестирование контроллера с использованием специальной привязки модели
-
18-09-2019 - |
Вопрос
В моем приложении у меня есть пользовательская привязка модели, для которой я установил DefaultBinder в файле global.asax:
ModelBinders.Binders.DefaultBinder = new XLDataAnnotationsModelBinder();
При написании модульных тестов для контроллеров мне нужно убедиться, что контроллер использует специальную привязку модели, но я не знаю, как это сделать.
Мой тест выглядит так:
[Test]
public void Details_Post_Action_Fails_To_Change_Email_Address_With_Duplicate()
{
// Setup
var controller = new AccountController();
controller.SetFakeControllerContext();
var param = Customer.Load(30005);
param.EmailAddress = "foo@bar.com";
// Test
var result = controller.Details(param);
// Assert
Assert.IsTrue(result is ViewResult); // will be ViewResult if failed....
Assert.IsFalse(((ViewResult)result).ViewData.ModelState.IsValid);
}
В этом модульном тесте контроллер использует DefaultModelBinder.Что я могу добавить в этот тест, чтобы гарантировать, что контроллер использует пользовательскую привязку модели?
Решение
Скотт Хансельман недавно сделал сообщение в блоге по этому поводу:
Разделение даты и времени — модульное тестирование привязок пользовательских моделей ASP.NET MVC
Та часть, которая вас заинтересует, находится внизу поста в разделе «Тестирование привязки пользовательской модели».По сути, вы создаете экземпляр ModelBindingContext, затем создаете экземпляр своего Modelbinder и вызываете Bind() в своем Modelbinder, передавая созданный вами ModelBindingContext (и контекст контроллера, если требуется).
Вот еще один вопрос в SO, который также содержит необходимую вам информацию (даже если вы не используете Moq):
Как провести модульное тестирование пользовательского ModelBinder с использованием Moq?