2009-12-09 4 views
26

Я искал stackoverflow и googled через четыре часа и все еще не нашел решения для моей «тривиальной» проблемы.Как я могу протестировать метод контроллера, который имеет атрибут [Авторизовать]?

Если вы пишете единичный тест для вашего отфильтрованного [Authorize] ActionResult, как вы решаете проблему подделать аутентификацию этого пользователя?

У меня есть много ActionResult методов, которые фильтруются с [Authorize], и я хочу, чтобы проверить все мои ActionResult метод независимо, если они будут отфильтрованы с [Authorize] или нет.

Простой пример того, что я имею в виду:

[TestMethod] 
public void Create_Get_ReturnsView() 
{ 
// Arrange 
var controller = new UserController(); 
// Act 
var result = controller.Create(); 
// Assert 
Assert.IsNotNull(result as ViewResult); 
} 

[Authorize] 
public ActionResult Create() 
{ 
return View("Create"); 
} 

В настоящее время испытания даже не ударил метод ActionResult из-за [Authorize] фильтра, за исключением брошенной является: System.NullReferenceException: Object reference not set to an instance of an object.

+1

Есть что-то, что вы нам не показываете. Тест, который вы показываете, не будет выполнять * любые * фильтры действий. Может быть, у вас есть код, который будет, но это не в вашем вопросе. Как насчет всего стека вызовов для ошибки, для стартеров? –

ответ

25

Вы необходимо высмеять контекст для вашего контроллера. Попробуйте использовать Moq

Ваш договоритесь будет выглядеть:

var controller = new UserController(); 
var mock = new Mock<ControllerContext>(); 
mock.SetupGet(x => x.HttpContext.User.Identity.Name).Returns("SOMEUSER"); 
mock.SetupGet(x => x.HttpContext.Request.IsAuthenticated).Returns(true); 
controller.ControllerContext = mock.Object; 

Вы должны быть в состоянии сделать то свой поступок & Assert.

Если вы еще этого не сделали, я настоятельно рекомендую посмотреть NerdDinner в качестве примера сайта MVC.

+0

Awsome, это работало безупречно ... Спасибо alot – Webking

+0

Я могу утверждать, что вам не нужно действительно проверять это вообще. Атрибут уже хорошо протестирован командой, написавшей ASP.NET MVC. Вы можете скачать источник и посмотреть сами. –

+8

Не нужно тестировать атрибут '[Authorized]', чтобы обойти его, чтобы проверить методы ActionResult – AndyMcKenna

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