2013-10-14 2 views
0

У меня есть следующий метод контроллераMVC4 - TryValidateModel ломает модульные тесты

public ActionResult Create(Category category) 
    { 
     //default values 
     if (string.IsNullOrEmpty(category.GeoAreaLevelIdentifier)) 
     { 
      category.GeoAreaLevelIdentifier = "OutputArea"; 
     }     
     category.CreatorIdentifier = EsdContext.User.UniqueIdentifier.ToString();    
     category.Created = DateTime.Now; 

     //validation 
     RevalidateModel(category); 

     new CategoryBroker().Create(category); 
     return JsonNow(category); 
    } 

, который заполняет некоторые значения по умолчанию в модели, а затем проверяет его. Это связано с тем, что клиентскому коду разрешается отправлять модель без некоторых необходимых полей. Недостающие поля заполняются контроллером (см. Выше).

метод RevalidateModel называет TryValidateModel:

protected void RevalidateModel(object model) 
    { 
     ModelState.Clear(); 
     TryValidateModel(model); //called explicitly since model has been updated 
     if (!ModelState.IsValid) 
     { 
      //error message 
     } 
    } 

Но когда я звоню Создать метод из модульного тестирования, он терпит неудачу, потому что TryValidateModel ожидает controllerContext:

 Value cannot be null.Parameter name: controllerContext 

Что это лучший способ решить эту проблему ? Должен ли я создать файл ControlContext, например, с помощью MvcContrib TestHelper?

+0

Да, вам нужно высмеять контекст контроллера, чтобы вызвать этот метод из модульного теста. – mayabelle

+0

@mayabelle «вам нужно высмеять контекст контроллера» - знаете ли вы, как это сделать? Вы пробовали MvcContrib.TestHelper? –

+0

http://stackoverflow.com/questions/332060/how-do-i-unit-test-actions-without-mocking-that-use-updatemodel – stuartdotnet

ответ

-1

В этом случае

using Moq; 
......... 
     readonly MockRepository _mockRepository = new MockRepository(MockBehavior.Default); 
......... 
     controller.ControllerContext = _mockRepository.Create<ControllerContext>().Object; 

работает достаточно хорошо.

Лучший.

Смежные вопросы