2013-03-25 1 views
1

Я немного новое тестирование модулей и пытаюсь использовать Moq и MSTest в Visual Studio 2012, чтобы создать тест по методу для одного из моих приложений. Приложение работает как надо, но когда я запускаю мой тест, я получаю пустую ссылку исключение на следующем:Web API RouteUrl возвращает исключение null в тесте

var fooURL = Url.RouteUrl("MyApi", new { httproute = string.Empty, controller = "MyController", id = id }, Request.Url.Scheme); 

Я пытался читать и обертывание моей головы вокруг ASP.NET MVC: Unit testing controllers that use UrlHelper, но они, как представляются, обеспокоены с тестированием самого URL. Я больше интересуюсь тестированием того, что приходит позже в моей функции.

Является ли установка, упомянутая в приведенной выше ссылке слишком маленькой (или слишком большой), чтобы мой тест работал? Или я смотрю в неправильном направлении?

+0

Что такое null? Это 'Request' или' Request.Url' или 'Request.Url.Scheme'? – ashes999

+0

К сожалению, я не знаю, как это определить. Все, что я получаю для сообщения об ошибке, это System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта, и когда я дважды нажимаю на мой StackTrace, я попал в строку, указанную выше. –

+0

без проблем. Загрузите TestDriven.NET; установить контрольную точку в тесте; щелкните правой кнопкой мыши, скажем, Test With, Debugger. Осмотрите переменные или используйте 'Watch', чтобы понять это. – ashes999

ответ

0

На основании ваших комментариев, похоже, Request - null. Я бы рекомендовал googling для how to mock out the request.

Я лично люблю Ninject/Moq. Это очень простая в использовании и мощная комбинация. Вы можете сделать что-то вроде:

  • Создайте интерфейс IHttpRequest с все, что нужно издеваться (в данном случае, просто атрибут Url)
  • Использование Ninject связать производственную программу (в приложении-старт global.asax в событие) к реальному запросу (Kernal.Bind<IHttpRequest>().To(HttpRequest))
  • в тестовых случаях имеют базовые тестовый класс или глобальный класс тест-прогон, который связывается с вашим макетом класса вместо (или к new Mock<IHttpRequest>() например)

You может потребоваться сделать вашу интуицию rface скопируйте необходимые методы/подписи из реального класса HttpRequest. Если это не сработает, вам необходимо создать класс-оболочку, который реализует интерфейс и делегирует вызовы реальному HttpRequest экземпляру.

+0

Это действительно сработало для вас? – ashes999

+0

Более того, выясняя, что выбрасывало нулевое значение. Возможность уточнить мой поиск помогла мне протестировать мой тест. –

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