2008-09-15 13 views
17

Я создал обучающее приложение с использованием Bort, которое является базовым приложением, которое включает в себя Restful Authentication и RSpec. Я запустил и запустил новый объект, который требует, чтобы пользователи вошли в систему, прежде чем они смогут что-либо сделать (before_filter :login_required в контроллере). [edit: Я должен также упомянуть, что пользователь has_many нового класса и только пользователь должен уметь его видеть.]Rails, Restful Authentication & RSpec - Как протестировать новые модели, требующие аутентификации

Я создал новую модель/контроллер с помощью генераторов Rspec, которые создали ряд параметров по умолчанию тесты. Они все проходят, если нет before_filter, но несколько сбой, как и следовало ожидать, после того, как before_filter на месте.

Как получить сгенерированные тесты для запуска, как если бы он не был зарегистрированным пользователем? Нужна ли мне целая серия совпадений, не входящих в систему - тесты перенаправления? Я предполагаю, что это какая-то насмешка или техника крепления, но я новичок в RSpec и немного блуждаю. Хорошие ссылки руководства RSpec также будут оценены.

ответ

7

У меня очень похожая настройка, и ниже приведен код, который я использую для проверки этого материала. В каждом из describe с я вставил:

it_should_behave_like "login-required object" 
def attempt_access; do_post; end 

Если все, что вам нужно, это Войти или

it_should_behave_like "ownership-required object" 
def login_as_object_owner; login_as @product.user; end 
def attempt_access; do_put; end 
def successful_ownership_access 
    response.should redirect_to(product_url(@product)) 
end 

Если вам нужна собственность. Очевидно, что вспомогательные методы меняются (очень мало) с каждым поворотом, но это делает большую часть работы для вас. Это находится в моем spec_helper.rb

shared_examples_for "login-required object" do 
    it "should not be able to access this without logging in" do 
    attempt_access 

    response.should_not be_success 
    respond_to do |format| 
     format.html { redirect_to(login_url) } 
     format.xml { response.status_code.should == 401 } 
    end 
    end 
end 

shared_examples_for "ownership-required object" do 
    it_should_behave_like "login-required object" 

    it "should not be able to access this without owning it" do 
    attempt_access 

    response.should_not be_success 
    respond_to do |format| 
     format.html { response.should be_redirect } 
     format.xml { response.status_code.should == 401 } 
    end 
    end 

    it "should be able to access this if you own it" do 
    login_as_object_owner 
    attempt_access 

    if respond_to?(:successful_ownership_access) 
     successful_ownership_access 
    else 
     response.should be_success 
    end 
    end 
end 
4

Я нашел несколько ответов на свой вопрос. В принципе, мне нужно было понять, как издеваться над пользователем от restful_authentication, чтобы тесты с автогенерируемыми rspec-контроллерами могли пройти, хотя я добавил before_filter: login_required.

Вот некоторые из моих только найденных ресурсов:

RSpec: It Should Behave Like

rspec, restful_authentication, and login_required

using restful_authentication current_user inside controller specs

DRYing up your CRUD controller RSpecs

1

Чтобы издеваться пользователя после входа в систему, я взломать контроллер для установки @current_user вручную:

module AuthHelper 
    protected 

    def login_as(model, id_or_attributes = {}) 
    attributes = id_or_attributes.is_a?(Fixnum) ? {:id => id} : id_or_attributes 
    @current_user = stub_model(model, attributes) 
    target = controller rescue template 
    target.instance_variable_set '@current_user', @current_user 

    if block_given? 
     yield 
     target.instance_variable_set '@current_user', nil 
    end 
    return @current_user 
    end 

    def login_as_user(id_or_attributes = {}, &block) 
    login_as(User, id_or_attributes, &block) 
    end 
end 
7

Когда не испытывая аутентификации, но тестирование контроллеров, которые нужны пользователю для аутентификации я обычно окурок метод фильтра:

before(:each) do 
    controller.stub!(:authenticate).and_return(true) 
end 

Приведенный выше пример работает там, где мой before_filter установлен в методе AUTHENTICATE :

before_filter :authenticate 

и аутентификация в моем приложении использует базовую аутентификацию HTTP, но на самом деле это может быть любой другой механизм аутентификации.

private 
def authenticate 
    authenticate_or_request_with_http_basic do |user,password| 
    user == USER_NAME && password == PASSWORD 
    end 
end 

Я думаю, что это довольно простой способ тестирования.

+0

Самый сладкий! – AnkitG 2013-10-10 15:16:05

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

  • Нет связанных вопросов^_^