Я пытаюсь проверить свой контроллер и поддерживать разделение проблем.RSpec в Rails: как пропустить файл before_filter?
Первой проблемой является «Кто может выполнить какое действие?»
Я использую authlogic для аутентификации и be9's acl9 для авторизации. Но это не имеет значения, все мои вопросы авторизации обрабатываются в before_filter
. Я проверяю такой before_filter
что-то похожее на это:
describe SomeModelsController, "GET to index (authorization)" do
before(:each) do
@siteadmin = mock_model(User)
@siteadmin.stub!(:has_role?).with("siteadmin", nil).and_return(true)
end
it "should grant access to a siteadmin" do
controller.should_receive(:current_user).at_least(:once).and_return(@siteadmin)
get :index
response.should be_success
end
end
Эта спецификация работает просто отлично!
Теперь вторая проблема: «Действует ли действие, что оно должно делать?»
Это не требует проверки авторизации. Лучшее/чистое решение будет пропускать что before_filter
все вместе и просто сделать что-то вроде:
describe SomeModelsController, "GET to index (functional)" do
it "should find all Models" do
Model.should_receive(:find).with(:all)
end
end
Без того, чтобы беспокоиться о том, какой пользователь с которым роль зарегистрированным в первом. Сейчас я решил это так:
describe SomeModelsController, "GET to index (functional)" do
before(:each) do
@siteadmin = mock_model(User)
@siteadmin.stub!(:has_role?).with("siteadmin", nil).and_return(true)
controller.stub!(:current_user).and_return(@siteadmin)
end
it "should find all Models" do
Model.should_receive(:find).with(:all)
end
end
Если теперь я решил, что мой SiteAdmin не имеет права доступа к акции индекса больше, было бы не только сломать одну спецификацию, а именно - спецификации, которая должна ворваться такой случай - но и совершенно несвязанный второй спек.
Я знаю, что это в основном незначительная проблема, но было бы неплохо, если бы кто-нибудь мог придумать (изящное) решение!
Спасибо, не подумал об этом. Если нет способа пропустить файл before_filter, это может быть лучшим решением. – sebastiangeiger
Хорошо, я обновил свой ответ. Надеюсь, это то, что вам нужно. – Baldu
Ницца, пропуская перед работой фильтр. Единственным недостатком является то, что acl9 устанавливает безымянный лямбда-фильтр по умолчанию, поэтому мне нужно заставить создать имя before_filter. – sebastiangeiger