#ruby-on-rails #tdd #cucumber
#ruby-on-rails #tdd #cucumber
Вопрос:
Как я могу подделать метод current_user, чтобы остановить сбой моих тестов cucumber?
Что-то вроде Given /^I am logged in$/
шага.
class ApplicationController < ActionController::Base
protect_from_forgery
helper_method :current_user
def facebook_cookies
@facebook_cookies ||= Koala::Facebook::OAuth.new.get_user_info_from_cookie(cookies)
end
def current_user
@graph = Koala::Facebook::GraphAPI.new(facebook_cookies['access_token'])
@current_user = User.find_by_fbid(@graph.get_object("me")["id"]) || User.create(:fbid => @graph.get_object("me")["id"])
end
end
Ответ №1:
Я не знаком с Koala, но это некоторые идеи, которые я успешно использовал с другими фреймворками аутентификации.
-
Определите current_user, чтобы он вел себя по-другому в тестовом режиме. Это немного некрасиво.
class ApplicationController < ActionController::Base ... def current_user if Rails.env == 'test' User.create! :username => 'Tester' else # do normal stuff end end .. end
-
Создайте шаг, который регистрирует пользователя для вас, и просто используйте его в начале каждого сценария
Given /^I am logged in$/ do passwd = 'realgoodpassword' user = User.create! :username => 'Tester', :password => passwd visit login_path fill_in 'Username', :with => user.username fill_in 'Password', :with => passwd click_button 'Sign in' end
Предполагается, что вы используете Capybara для питания Cucumber. Webrat может выглядеть по-другому; загляните в features/step_definitions/web_steps.rb, чтобы получить некоторые идеи.
Комментарии:
1. Я хотел бы что-то вроде номера 2. Проблема в том, что для входа в систему нет имени пользователя или пароля, он полагается на файлы cookie.
2. 1 действительно уродлив, но на данный момент может быть выходом
3. «Проблема» с Capybara и подобными инструментами (например, Webrat) заключается в том, что они рабски пытаются скопировать опыт реального пользователя. Следовательно, они часто запрещают простые и очевидные способы тестирования, такие как доступ к контроллеру, запросу, файлам cookie или скрытым полям.