Я пытаюсь протестировать свой контроллер и разделить проблемы.
Первая проблема: кто может выполнить какое действие?
Я использую 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 больше не имеет права доступа к действию index, это нарушило бы не только одну спецификацию, а именно спецификацию, которую ДОЛЖЕН нарушить в таком случае, но и совершенно не связанную вторую спецификацию.
Я знаю, что это в основном незначительная проблема, но было бы неплохо, если бы кто-нибудь мог придумать (элегантное) решение!