2012-04-03 3 views
2

У меня есть следующий код в моем методе действия контроллера:Controller.User является Null Во время испытания блока

if (User.Identity.IsAuthenticated) 
{ 
    // ... 
} 

Это, кажется, работает хорошо. Но когда я запускаю единичный тест, который вызывает это действие, он терпит неудачу, потому что User имеет значение null?

Может ли кто-нибудь предложить лучший способ справиться с этим? Нужно ли мне реструктурировать этот код только для модульных тестов?

ответ

3

Возможно, вам необходимо установить свойство User как часть вашей настройки. Вы сделали бы это, высмеивая HttpContextBase через ControllerContext, используемый для создания контроллера, чтобы он возвращал вашего издевавшегося пользователя. Установите свой mocked ControllerContext в собственность ControllerContext, и он найдет User, если вы правильно настроили граф объекта.

2

User свойство Controller класса копируется из текущего HttpContext - вы должны обеспечить контекст и установить User там надлежащим образом для этой работы в модульных тестов.

2

Пользователь будет иметь значение null, если вы запустите код за пределами контекста веб-запроса. Похоже, вы напрямую используете тесты своих методов.

У вас есть два варианта.

Самое быстрое исправление вашей проблемы, но не обязательно наиболее устойчивое исправление, состояло бы в том, чтобы просто вызвать ваш веб-сайт с вашего тестового модуля как WebRequest.

Более устойчивым решением будет сбор ваших контекстно-зависимых функциональных возможностей на стороне сервера (например, User) в один класс, который вы можете издеваться/подделывать.

Редактировать

Может кто-нибудь предложить лучший способ справиться с этим? Нужно ли мне реструктурировать этот код только для модульных тестов?

Итоговый ответ «да». Что еще более важно, вы, вероятно, захотите, потому что это сделает вашу систему более гибкой и/или ремонтируемой в долгосрочной перспективе.

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