2013-06-25 3 views
0

Я уже прочитал this и попробовал решение, и это не сработало для меня. Я пытаюсь понять это и, возможно, я не тестирую это правильно. Я получаю NullReferenceException на линии в контроллере, где я тестирую ModelState. Я использую MVC 3 с NUnit в качестве своего набора тестов. ShouldBeViewNamed("Index") - это метод расширения, который я написал для проверки имени представления, которое я возвращаю, но я даже не догадываюсь, когда выполняю код. Вот мой контроллер:Почему мой ModelState null при запуске модульного теста?

public class TestController : Controller 
{ 
    [HttpPost] 
    public ViewResult Index(TestModel model) 
    { 
     if(ModelState.IsValid) // results in a null reference exception. 
      return View(); 

     return new ViewResult(); 
    } 
} 

и тестовый класс:

[TestFixture] 
public class TestControllerTest 
{ 
    [Test] 
    public void TestingModelState() 
    { 
     // Arrange 
     var model = new TestModel(); 
     var controller = new TestController(); 
     // Arbitrary values to indicate an error in the model 
     controller.ModelState.AddModelError("tester1", "error happened"); 

     // Act 
     var result = controller.Index(model); 

     // Assert 
     result.ShouldBeViewNamed("Index"); 
    } 
} 

По мнению большинства блогов, которые я читал, это должно «просто работать». Но независимо от того, что я делаю, ModelState всегда имеет значение null ... Если это работает для кого-то другого, я предполагаю, что это связано с моей локальной настройкой или, возможно, с каркасом, который мы используем. У меня был еще один тест разработчика в моем магазине, и он также получает то же исключение.

EDIT: Я сузил проблему, чтобы быть конкретным для этого конкретного проекта. Добавляя новый проект к решению и тестируя те же тесты, я не могу дублировать эту проблему. Излишне говорить, что это унаследованный проект, который был запущен в 2009 году, вероятно, как проект MVC 1, и был повышен до MVC 3. Далее я рассмотрю настройки уровня проекта.

EDIT: См. Ответ ниже, получается, что консультант, которого мы наняли некоторое время назад, попытался обновить проект до MVC 4, столкнулся с некоторыми проблемами и никогда не возвращал файлы. Большинство модульных тестов все еще проходили, и проекты выполнялись нормально, но проект NUnit имел плохую ссылку на MVC 4. Мне пришлось вручную удалить ссылку из файла .csproj и прочитать его в VS, и все работает.

ответ

2

Убедитесь, что ваш проект NUnit ссылается на ту же версию System.Web.Mvc.dll, что и на ваш проект MVC.

+0

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

+0

Я потерял день, пытаясь найти решение для этого. Спасибо за этот ответ. – elector