Имитация наличия атрибута Authorize

Мне было интересно, как вы могли издеваться над тем, что контроллер украшен атрибутом [Authorize] в MVC3? Я использую настраиваемый поставщик членства. Я хотел бы проверить, что контроллер был украшен атрибутом, и вы авторизованы, и что происходит, когда вы не авторизованы. Я использую Мок. Любые хорошие предложения по этому поводу?!

ОБНОВЛЕНИЕ: в настоящее время я получаю исключение NullreferenceException, в котором говорится, что «ссылка на объект не установлена ​​​​на экземпляр объекта». Это та же ошибка, о которой упоминалось ранее в этом сообщении

Это связано с атрибутом авторизации. Я работаю под iis и не использую cassini. Кто-нибудь знает, связано ли это как-то с пулом приложений и правами пользователей. Тесты, которые у меня есть для атрибута авторизации, не будут работать, пока это не будет исправлено.

Может быть, есть какой-то другой способ проверить атрибут авторизации? Заранее большое спасибо.

UPDATE2 Итак, после обширных исследований и помощи в отладке от коллеги я упомянул об устранении проблемы с атрибутом [Authorize]. Похоже, что эта строка в web.config отсутствует:

<modules runAllManagedModulesForAllRequests="true">

Как ни странно, это не вызвало проблем у другого коллеги, который использовал магистраль или бета-среду. Это только вызвало проблемы для меня локально. Это могло быть связано с чем-то в GAC. Так или иначе теперь все работает.

Спасибо.


person Tim    schedule 23.08.2011    source источник
comment
Что вы выполняете в своем тесте? Действие контроллера? Как вы его выполняете? Вы вызываете его непосредственно из своего набора тестов как обычный метод или он вызывается через инфраструктуру MVC?   -  person Tz_    schedule 24.08.2011
comment
Хороший вопрос. я то и дело об этом, не совсем уверен, как это сделать. Да, действие контроллера. Я использую инфраструктуру MVC - лучший способ сделать это. Или что вы думаете?!   -  person Tim    schedule 24.08.2011


Ответы (1)


Я написал сообщение в блоге именно об этом пару месяцев назад:

http://thomasardal.com/unit-testing-attribute-decorations/

person ThomasArdal    schedule 24.08.2011
comment
Это выглядит в основном то, что я ищу. Хотя в надежде не использовать другой фреймворк (Шоудли). Может быть, я мог бы использовать этот метод расширения в любом случае. Спасибо - person Tim; 24.08.2011
comment
Вам не нужно использовать Shouldly, чтобы использовать метод расширения. Эти двое никак не связаны. Все, что я пишу, это то, что метод вдохновлен Шоудли. Вы можете скопировать код в свой собственный исходный код и сразу же использовать метод. - person ThomasArdal; 24.08.2011
comment
Правильно об этом :). Попробую и вернусь с отзывом. Спасибо. - person Tim; 24.08.2011
comment
+1. Хорошая прагматичная идея — просто проверить объявление самого атрибута и полагаться на то, что фреймворк сделает с ним то, что должен. Я думал о том, чтобы каким-то образом протестировать поведение (подделка всего HttpContext, ControllerContext и черт знает что еще необходимо), но это было бы слишком сложно без особых дополнительных преимуществ. Меня также частично ввел в заблуждение вопрос, поскольку в нем упоминалось о насмешке над атрибутом (это означает, что атрибута нет, но вы хотите подделать его для какой-то цели). - person Tz_; 24.08.2011
comment
Да, вопрос, возможно, немного вводил в заблуждение, поскольку я не совсем уверен, как вы должны это проверить. Поскольку я думал, что доверяю структуре, чтобы позаботиться о перенаправлениях. Я просто хотел проверить, что контроллер или действие украшено атрибутом Authorize. - person Tim; 24.08.2011
comment
Томас, я не мог заставить его работать должным образом. Причина здесь: var controller = new HomeController(); controller.ShouldHave(x => x.Index(), typeof(AuthorizeAttribute)); вы используете .ShouldHave и что я не уверен, как применить к моему делу, какие-нибудь советы? - person Tim; 25.08.2011
comment
Вам нужно создать новый класс в тестовом проекте. Назовите его как-то вроде AttributeExtensions. Сделайте класс статическим и добавьте метод ShouldHave из моего сообщения в блоге. В свой тест вам нужно включить пространство имен, в которое вы поместили класс AttributeExtensions. Это должно делать свое дело :) - person ThomasArdal; 25.08.2011
comment
Работал как прелесть, хотя я получаю сообщение об ошибке, говорящее о том, что ссылка на объект не установлена ​​​​на экземпляр объекта?!! Вы испытали это? Спасибо. - person Tim; 25.08.2011
comment
Прошу прощения, но нет. Где вы видите ошибку. В моем коде или в вашем коде? Может быть, вы могли бы отправить трассировку стека. - person ThomasArdal; 25.08.2011
comment
Вот трассировка стека gist.github.com/1170471, хотя я думаю, что ваш код работает нормально. Я думаю, что атрибут Authorize не работает. - person Tim; 25.08.2011
comment
@Thomas, теперь я понял, что класс AttributeExtensions выдает ошибку. Точнее здесь: var propertyInfo = memberExpression.Member as PropertyInfo; Это та же ошибка, о которой я упоминал ранее. - person Tim; 26.08.2011
comment
@Tim memberExpression, скорее всего, имеет значение null. Можете ли вы отправить код из своего теста, где вы используете метод ShouldHave. Может быть, я могу помочь вам определить, что идет не так. Также вы добавили атрибут Authorize в метод? - person ThomasArdal; 26.08.2011
comment
@Томас. Хм, я на самом деле использую его на всем контроллере. Атрибут авторизации. Мой тест идентичен вашему. Тогда, я думаю, перепишите тест, чтобы он отражал тот факт, что он применяется к контроллеру, а не только к методу? - person Tim; 29.08.2011
comment
Метод написан для проверки наличия атрибута Authorize в методе, а не в классе. Могу ли я увидеть ваш тестовый код, где вы используете мой метод? Мне было интересно, что вы пишете в лямбде. - person ThomasArdal; 29.08.2011
comment
@Thomas: Конечно, но, как я уже сказал, я использую его как есть, как вы написали. gist.github.com/1178090, возможно, я что-то упустил в вашем руководстве. Думал хватит?! Спасибо! Кстати, я пытаюсь просто украсить метод Index с помощью атрибута byt и получил ту же ошибку. - person Tim; 29.08.2011
comment
Хм. Не могу понять, что ты должен был сделать что-то не так. У меня заканчиваются варианты :( Я использую этот метод во многих тестах, и он отлично работает. Может быть, это слишком, но если вы создадите простой проект, воссоздающий ошибку, я буду рад взглянуть на ошибку для тебя. - person ThomasArdal; 29.08.2011
comment
Нет, я знаю. Странный. Я сделал, как вы сказали, начал новый новый проект и воспроизвел ошибку: MvcApplication4.AuthorizeAttributeSpec.should_validate_attribute: System.NullReferenceException: ссылка на объект не установлена ​​​​на экземпляр объекта. Это относится к этой строке: var propertyInfo = memberExpression.Member as PropertyInfo; Странно, я просто украшаю метод Index атрибутом [Authorize], никакой роли и ничего больше. - person Tim; 29.08.2011
comment
Да, спасибо. Вот это gist.github.com/1178313 с учетом того факта, что у меня есть два атрибута авторизации это потому, что я тестировал обе вещи. - person Tim; 29.08.2011
comment
@ThomasArdal позвольте нам продолжить обсуждение в чате - person Tim; 29.08.2011
comment
Тесто! Ошибка была в моем коде. Я обновил сообщение в блоге, чтобы избежать путаницы в будущем :) - person ThomasArdal; 30.08.2011