Как издеваться над 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 77

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-это объект, который проверяет правильность модели. Таким образом, я могу просто установить значения объекта и проверить его.

ответ uadrive занял у меня часть пути, но все еще были некоторые пробелы. Без каких-либо данных на входе в new NameValueCollectionValueProvider(), связыватель модели свяжет контроллер с пустой моделью, а не с