水豚的多个会话
Multiple sessions in capybara
背景
我想在我的网络应用程序上测试以多个用户身份登录,我正在使用 Cucumber 和 capybara 来执行此操作。我找到了关于如何处理多个会话的 this link,但不幸的是,cucumber 似乎无法找到定义的 in_session
方法。我怎样才能访问它?
黄瓜场景
Given I go to teacher login in Steve's browser
When I enter "Steve" in the username field
And I enter "StevesPassword" in the password field
And I click login
Then I should see "Steve Lastname" as the current user
When I go to teacher login in Lisa's browser
And I enter "Lisa" in the username field
And I enter "LisasPassword" in the password field
And I click login
Then I should see "Lisa Lastname" as the current user
Ruby代码
#standard_definitions/switching_sessions.rb
When /^(.*) in (.*) browser$/ do |next_step, name|
in_session(name) do
step next_step
end
end
#features/support/sessions.rb
module Capybara
module Driver
module Sessions
def set_session(id)
Capybara.instance_variable_set("@session_pool", {
"#{Capybara.current_driver}#{Capybara.app.object_id}" => $sessions[id]
})
end
def in_session(id, &block)
$sessions ||= {}
$sessions[:default] ||= Capybara.current_session
$sessions[id] ||= Capybara::Session.new(Capybara.current_driver, Capybara.app)
set_session(id)
yield
set_session(:default)
end
end
end
end
错误
当我 运行 这样做时,我得到以下信息:
Scenario: multiple users # features/Provebank/Provebank.feature:23
Given I go to teacher login in Steve's browser # features/step_definitions/standard_definitions/switching_sessions.rb:5
undefined method `in_session' for Capybara::Driver::Sessions:Module (NoMethodError)
./features/step_definitions/standard_definitions/switching_sessions.rb:8:in `/^(.*) in (.*) browser$/'
features/test.feature:24:in `Given I go to teacher login in Steve's browser'
如文章顶部所述,您 link 编辑了 "This is now included in the Capybara library." - 除了该方法被命名为 Capybara.using_session
而不是 in_session,因此您不需要features/support/session.rb。请注意,您的测试编写方式以及您共享的 link 中的代码,只有以 "in xxxx's browser" 结尾的步骤实际上会出现在不同的会话中,而不是您在这些行下标记的步骤.要使这些步骤组中的每组都在它们自己的会话中发生,您需要在每一行上使用 "in xxx's browser",或者在一个步骤中使用 Capybara.session_name = <name>
,然后将其用于以后的步骤。如果直接设置 session_name 如果您希望将来的场景默认为该会话,您可能希望在 After 块中将其重置为 :default。
# only next_step will be executed in the alternate session
When /^(.) in (.*) browser$/ do |next_step, name|
Capybara.using_session(name) do
step next_step
end
end
# all future steps will be executed in the alternate session
# you probably want to reset this to :default in an After block
Given /^I switch to (.*) browser$/ do |name|
Capybara.session_name = name
end
如果我正确理解了你的问题,那么一种方法是将 Capybara 会话重命名为:
user1 = Capybara::Session.new(:selenium)
user1.visit "foo/bar"
user2 = Capybara::Session.new(:selenium)
user2.visit "bar/foo"
user1.click_on "Sign in"
user2.click_on "Log in"
等等
另请查看 rack_session_access
gem。也许这就是您要找的东西?
背景
我想在我的网络应用程序上测试以多个用户身份登录,我正在使用 Cucumber 和 capybara 来执行此操作。我找到了关于如何处理多个会话的 this link,但不幸的是,cucumber 似乎无法找到定义的 in_session
方法。我怎样才能访问它?
黄瓜场景
Given I go to teacher login in Steve's browser
When I enter "Steve" in the username field
And I enter "StevesPassword" in the password field
And I click login
Then I should see "Steve Lastname" as the current user
When I go to teacher login in Lisa's browser
And I enter "Lisa" in the username field
And I enter "LisasPassword" in the password field
And I click login
Then I should see "Lisa Lastname" as the current user
Ruby代码
#standard_definitions/switching_sessions.rb
When /^(.*) in (.*) browser$/ do |next_step, name|
in_session(name) do
step next_step
end
end
#features/support/sessions.rb
module Capybara
module Driver
module Sessions
def set_session(id)
Capybara.instance_variable_set("@session_pool", {
"#{Capybara.current_driver}#{Capybara.app.object_id}" => $sessions[id]
})
end
def in_session(id, &block)
$sessions ||= {}
$sessions[:default] ||= Capybara.current_session
$sessions[id] ||= Capybara::Session.new(Capybara.current_driver, Capybara.app)
set_session(id)
yield
set_session(:default)
end
end
end
end
错误
当我 运行 这样做时,我得到以下信息:
Scenario: multiple users # features/Provebank/Provebank.feature:23
Given I go to teacher login in Steve's browser # features/step_definitions/standard_definitions/switching_sessions.rb:5
undefined method `in_session' for Capybara::Driver::Sessions:Module (NoMethodError)
./features/step_definitions/standard_definitions/switching_sessions.rb:8:in `/^(.*) in (.*) browser$/'
features/test.feature:24:in `Given I go to teacher login in Steve's browser'
如文章顶部所述,您 link 编辑了 "This is now included in the Capybara library." - 除了该方法被命名为 Capybara.using_session
而不是 in_session,因此您不需要features/support/session.rb。请注意,您的测试编写方式以及您共享的 link 中的代码,只有以 "in xxxx's browser" 结尾的步骤实际上会出现在不同的会话中,而不是您在这些行下标记的步骤.要使这些步骤组中的每组都在它们自己的会话中发生,您需要在每一行上使用 "in xxx's browser",或者在一个步骤中使用 Capybara.session_name = <name>
,然后将其用于以后的步骤。如果直接设置 session_name 如果您希望将来的场景默认为该会话,您可能希望在 After 块中将其重置为 :default。
# only next_step will be executed in the alternate session
When /^(.) in (.*) browser$/ do |next_step, name|
Capybara.using_session(name) do
step next_step
end
end
# all future steps will be executed in the alternate session
# you probably want to reset this to :default in an After block
Given /^I switch to (.*) browser$/ do |name|
Capybara.session_name = name
end
如果我正确理解了你的问题,那么一种方法是将 Capybara 会话重命名为:
user1 = Capybara::Session.new(:selenium)
user1.visit "foo/bar"
user2 = Capybara::Session.new(:selenium)
user2.visit "bar/foo"
user1.click_on "Sign in"
user2.click_on "Log in"
等等
另请查看 rack_session_access
gem。也许这就是您要找的东西?