Доступ к текущему пользователю в функциях Cucumber - Devise - PullRequest
9 голосов
/ 10 июня 2011

Примечание: я очень плохо знаком с огурцом.

Я пытаюсь сделать обобщенный шаг (не уверен, существует ли он где-то уже или нет), чтобы вы могли легко добавлять объекты к другому объекту, если существует ассоциация. Я хочу сделать что-то вроде:

manage_notes.feature

Background: Login User
  Given the following user records
    | email          | password |
    | test@email.com | password |
  Given I am logged in as "test@email.com" with password "password"

Scenario: Edit existing note
  Given I have already created a note that belongs to current_user

general_steps.rb

Given /^the following (.+) records?$/ do |factory, table|
  table.hashes.each do |hash|
    Factory(factory, hash)
  end
end

Given /^I am logged in as "([^\"]*)" with password "([^\"]*)"$/ do |email, password|
  unless email.blank?
    visit new_user_session_path
    fill_in "Email", :with => email
    fill_in "Password", :with => password
    click_button "Sign In"
  end
end

note_steps.rb

  Given /^I have already created a (.+) that belongs to (.+)$/ do |factory, resource|
      model = Factory(factory)
      resource.send(model.class.to_s.downcase.pluralize) << model
  end

Похоже, что есть способ использовать помощник 'current_user' для разработки.

Как правильно получить доступ к зарегистрированному пользователю?

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Спасибо!

ОБНОВЛЕНИЕ 1: Я временно исправил свою проблему, создав новый шаг, который позволяет мне сделать:

Given I have already created a note that is owned by the user with email "test@email.com"

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

ОБНОВЛЕНИЕ 2: Добавлен general_steps.rb

Итак, вы можете видеть, что в моем «Background» пользователь создается через Factory, а затем авторизуется через мой интерфейс. Я хочу получить доступ к модели пользователя, вошедшего в систему.

Ответы [ 4 ]

3 голосов
/ 15 июня 2013

Я просто решаю это очень просто: У меня есть "FactoryGirl" пользователь, то этот метод ...

Given(/^I am users logged in as "(.*?)" with password "(.*?)"$/) do |email, pass|
  visit new_user_session_path
  fill_in "user_email", :with => email
  fill_in "user_password", :with => pass
  click_button I18n.t("login.sign_in")
  @current_user = User.find_by_email(email)
end

в дальнейшем Вы можете использовать @current_user в своих шагах

3 голосов
/ 17 июня 2011

Я не использую Devise, поэтому не могу ответить конкретно, если у Devise есть метод доступа current_user.

Но мне действительно нравится использовать Pickle , чтобы помочь мне сохранить мои рекомендации. И, возможно, это поможет вам, пока вы не найдете более конкретный способ разработки для достижения того, чего вы хотите.

Given /^the following (.+) records$/ do |factory, table|
  table.hashes.each do |hash|
    Factory(factory, hash)

    # since this is like an all encompassing factory creator, this line to 
    # create a Pickle references might need a bit more extra work if you want
    # to create references for other factory types

    # I assume email is unique, else use a unique identifier of some sort
    find_model! %{user: "#{hash['email']}"}, {:email => hash['email']} 
  end
end

Given /^I have already created a (.+) that belongs to #{capture_model}$/ do |factory, name|
  model = Factory(factory)
  ref = model!(name) # we find that reference here
  ref.send(model.class.to_s.downcase.pluralize) << model
end

Это будет читать

Given I have already created a note that belongs to user: "test@email.com"

# I would just change this to 
Given I have already created a note

# or
Given a note was created for user: "test@email.com"

Вы I, так как вы сказали Given I logged in..., нет необходимости говорить that belongs to user: "test@email.com" это уже you.

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


Хотя вам все еще приходится ссылаться в явном виде (например, пользователь: "Джон Доу"), я думаю, что это плюс. Всегда вызывая конкретные ссылки, все знают, на кого ссылаются, и не возникает вопросов о том, кто что делает, с чем.

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

У Pickle большое количество применений, поэтому обязательно взгляните.


Upate

Вы должны оказаться здесь. Поскольку, как вы и хотели, здесь нет опции current_user (насколько нам известно). Так что в этом сценарии вы должны найти «актера».

Given /^I have already created a note$/ do
  user = model!(%{user: "test@email.com"}) # if using pickle
  # user = User.find_by_email("test@email.com") # if just regular AR
  user.notes << Note.create
end
2 голосов
/ 17 октября 2012

Эта тема довольно старая, но вот решение, которое я использую. Вы должны загрузить этот модуль, например, в env.rb. Используя его, вы можете получить доступ к текущему пользователю, используя @current_user или current_user в ваших шагах.

module UserSessionHelper
  def current_user
    @current_user
  end

  def login(user=nil)
    if user.nil?
      @current_user = FactoryGirl.create(:user, username: fake_name)
    else
      @current_user = user
    end
    visit login_path
    fill_in 'Username', with: @current_user.username
    fill_in 'Password', with: '1234'
    click_button 'Login'
    page.should have_content('Logout')
  end

  def logout
    click_link 'Logout'
  end
end

RSpec.configure do |config|
  config.include UserSessionHelper
end if RSpec.respond_to?(:configure)

World(UserSessionHelper) if respond_to?(:World)
1 голос
/ 14 июня 2011

Вы должны иметь возможность использовать контекст для этого: http://cuke4ninja.com/sec_sharing_context.html

Сделайте шаг, когда вы войдете в систему как пользователь, сохраните его в общем контексте, доступном для всех шагов, а затем просто получите доступ к нему в следующих шагах.

Надеюсь, что это делает шаги, и я не неправильно истолковал вопрос.

Удачи с этим!

...