тестирование устройства логин с огурцом - PullRequest
1 голос
/ 01 июня 2011

Я знаю, что идеальным вариантом было бы заполнить форму входа и следовать этому потоку. Дело в том, что я не использую devise для входа в систему. Я делаю вход в свое приложение пользователем после аутентификации с помощью Facebook и гема fb_graph.

Таким образом, в представлении devise sign_in есть только ссылка «связаться с Facebook», но я могу видеть этот маршрут, и я предполагаю, что он попытается войти в систему пользователя, если на этот URL будет отправлено сообщение.

Я попытался сделать сообщение для sign_in (это представление пусто) напрямую с огурцом, и хотя ответ в порядке, пользователь не вошел в систему.

Given /^I am a logged in user$/ do
  @user = Factory(:user)
  res = post("/users/sign_in", :email => @user.email, :password => "password")
  p res
end

Как я могу это проверить?

Спасибо

UPDATE:

Сценарий выглядит так:

Scenario: Going to the index page
  Given I am a logged in user
  And there is a subject created
  And there is 1 person for that subject
  When I go to that subject persons index page
  And show me the page
  Then I should see "Back to Subjects list"

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Вместо этого, которым я не горжусь, я в итоге сделал следующее:

Контроллер приложений

before_filter :authenticate_user!, :except => [:login]

# This action is supposed to only be accessed in the test environment.
# This is for being able of running the cucumber tests.
def login
  @user = User.find(params[:id])
  sign_in(@user)
  current_user = @user
  render :text => "user logged in"
end

Маршруты

# This is for being able of testing the application with cucumber. Since we are not using devise defaults login
match 'login/:id' => 'application#login', :as => 'login', :via => [:get] if Rails.env.test?

Действия пользователя

Given /^I am a logged in (student|employee)+ user$/ do |role|
  @user = @that = Factory(:user, :role => role, :name => "#{role} User Name")
  Given("that user is logged in")
end

Given /^that user is logged in$/ do
  Given("I go to that users login page")
end

Путь

when /that users login page/
  login_path(@that || @user)

Таким образом, в моих сценариях мне нужно только набрать:

Given I am a logged in student user

А остальное просто обычный огурец ...

0 голосов
/ 02 июня 2011

Я должен сказать, что это какое-то неприятное обезьянье пятно, которое я придумал.

Добавил это в мой application_controller.

if Rails.env.test?
  prepend_before_filter :stub_current_user
  # UGLY MONKEY PATCH. we need a current user here.
  def stub_current_user
    unless user_signed_in?
      @user = Factory(:user)
      sign_in(@user)
      current_user = @user
    end
  end
end

Помните, что в моем приложении нет формы sign_in, и я использую devise.Возможно, позже я попытаюсь найти лучший подход, но сейчас это позволит мне сделать все.

...