2010-12-05 2 views
1

Обновленного

Я недавно изменил вид на сообщение своего контроллер объекта JSON, а не FormCollection.модульного тестирования метода UpdateModel в рамках MVC 3.0

Для того, чтобы получить модульный тест для работы этого контроллера, мы устанавливаем поставщика formvalue объекту словаря, чтобы остановить метод UpdateModel от выброса nre.

Итоговый итоговый блок ниже, однако, не чувствует себя правильно, что нужно делать. Любое понимание того, как переделать это, было бы весьма полезно.

[HttpPost] 
    public ActionResult ThemeContent(content model) 
    { 
     if (ModelState.IsValid) 
     { 
      var content = _contentRepository.GetContent(model.id); 
      if (content == null) 
      { 
       content = new content(); 
       UpdateModel(content); 
       _contentRepository.Add(content); 
       _contentRepository.Save(); 
      } 
      else 
      { 
       UpdateModel(content); 
       _contentRepository.Save(); 
      } 

      return Json(new 
      { 
       redirectUrl = Url.Action("index", "success", new {id = content.id}), 
       isRedirect = true 
      }); 
     } 

     string errorMessage = "{"; 

     foreach (var key in ModelState.Keys) 
     { 
      var error = ModelState[key].Errors.FirstOrDefault(); 
      if (error != null) 
      { 
       if (errorMessage != "{") 
       { 
        errorMessage += ","; 
       } 
       errorMessage += (char) 34 + "#" + key + (char) 34 + ":" + (char) 34 + error.ErrorMessage + (char) 34; 
      } 
     } 

     errorMessage += "}"; 

     return Json(new 
     { 
      Message = errorMessage, 
      isRedirect = false 
     }); 

    } 

Заранее спасибо.

+0

Я не совсем понимаю, почему вы вызываете UpdateModel, когда у вас уже есть все значения, необходимые для привязки модели к объекту «model» в параметре действия. – 2010-12-06 22:10:08

+0

Спасибо, что указали, что Брэд. Глубокий надзор с нашей стороны значительно увеличил сложность наших тестов. – Jesse 2010-12-07 01:12:29

ответ

0

Обновлено, поскольку мы неправильно использовали метод updatemodel.

 //setup 
     var fakeContent = new content 
     { 
      address1 = "123 test street" 
     }; 

     _controller.Url = new UrlHelper(
      new RequestContext(
       _controller.HttpContext, new RouteData() 
       ), 
      new RouteCollection() 
      ); 

     //execute 
     var result = _controller.ThemeContent(fakeContent) as JsonResult(); 

     //assert 
     Assert.AreEqual("123 test street", _content.address1); 
0

Вам нужно высмеять контекст контроллера в своем модульном тесте, если действие контроллера, которое вы пытаетесь проверить, зависит от него. Я настоятельно рекомендую вам взглянуть на MVCContrib.TestHelper, что упростит задачу издевательств над этим контекстом и сделает ваши модульные тесты более элегантными.

+0

Спасибо Дарин. Я добавил ссылку на TestHelper и играл с ним сегодня днем. У вас есть пример того, как правильно создать единичный тест, когда тестируемый контроллер обновляет модель? – Jesse 2010-12-06 02:14:35

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