rspec testing: putting :js => true 也会影响 before 块
rspec testing: putting :js => true also affects the before block
我有一个用于预约的页面,它有一些 javascript 代码可以选择预约可用的最早时间和日期,之后用户可以单击按钮来安排预约.
所以为了测试它,我写了一些 rspec 测试,如下所示,
book_appointment_spec.rb
context "when on the profile page" do
before do
click_linkedin_button
end
it 'book an appointment', :js => true do
click_link "new-appointment"
choose "doctor1"
click_button "Submit and Schedule"
expect(page).to have_content "Congrats!"
end
end
click_linkedin_button 是一个方法定义,它只是通过 linkedin oauth 登录用户。问题是,即使在设置 OmniAuth.config.mock_auth[:linkedin]
之后,每当我在它周围设置 :js => true 块时,它都会要求我通过 linkedin 登录,http://imgur.com/mYUOxgD
我想知道是否有人知道如何解决这个问题。
以下是可能与此问题相关的其他文件。
spec_helper.rb
require 'capybara/webkit/matchers'
Capybara.javascript_driver = :webkit
宝石文件
gem 'capybara-webkit'
gem 'database_cleaner'
gem 'capybara'
在 rspec 块中设置 js: true
是在整个示例中使用支持 javascript 的驱动程序的快捷方式。因此,此驱动程序将在整个执行或示例期间可用和使用,其中包括所有 before/after/around 个块。
要解决此问题,您可以手动设置要在示例中需要的位置使用的驱动程序,而不是使用 js: true
。
it {
do_some_stuff_with_default_driver
Capybara.current_driver = :webkit
do_some_stuff_with_webkit
Capybara.current_driver = :selenium
do_some_stuff_with_selenium
}
编辑
糟糕,我刚刚读到这篇文章,所以该解决方案可能行不通。请告诉我
Note: switching the driver creates a new session, so you may not be able to switch in the middle of a test.
我通过创建一个实际的 linkedin 帐户解决了这个问题,将该身份验证信息放在 .env 中,然后调用 fill_in 方法在回调期间填写电子邮件和密码字段。并在整个上下文块中坚持 运行 一个 js 驱动程序。
编辑:这当然不是最佳答案,所以我仍然接受其他答案。
如您所见,您不能 运行 部分测试使用一个驱动程序而部分测试使用另一个驱动程序。这相当于说
Given I login in using Safari.
Then I should be logged in using Firefox.
所以你的解决方法是你必须运行你的测试环境下的js登录代码才能登录。这其实是一件好事(你要测试你的js登录代码)。如果你想避免实际连接到 linkedin,每次你 运行 这个测试,那么你需要模拟到 linkedin 的连接。看一下 VCR (https://github.com/vcr/vcr),这将允许您记录您与 linkedin 的连接,以便在后续测试中 运行s 您不必转到 linkedin。
我有一个用于预约的页面,它有一些 javascript 代码可以选择预约可用的最早时间和日期,之后用户可以单击按钮来安排预约.
所以为了测试它,我写了一些 rspec 测试,如下所示,
book_appointment_spec.rb
context "when on the profile page" do
before do
click_linkedin_button
end
it 'book an appointment', :js => true do
click_link "new-appointment"
choose "doctor1"
click_button "Submit and Schedule"
expect(page).to have_content "Congrats!"
end
end
click_linkedin_button 是一个方法定义,它只是通过 linkedin oauth 登录用户。问题是,即使在设置 OmniAuth.config.mock_auth[:linkedin]
之后,每当我在它周围设置 :js => true 块时,它都会要求我通过 linkedin 登录,http://imgur.com/mYUOxgD
我想知道是否有人知道如何解决这个问题。
以下是可能与此问题相关的其他文件。
spec_helper.rb
require 'capybara/webkit/matchers'
Capybara.javascript_driver = :webkit
宝石文件
gem 'capybara-webkit'
gem 'database_cleaner'
gem 'capybara'
在 rspec 块中设置 js: true
是在整个示例中使用支持 javascript 的驱动程序的快捷方式。因此,此驱动程序将在整个执行或示例期间可用和使用,其中包括所有 before/after/around 个块。
要解决此问题,您可以手动设置要在示例中需要的位置使用的驱动程序,而不是使用 js: true
。
it {
do_some_stuff_with_default_driver
Capybara.current_driver = :webkit
do_some_stuff_with_webkit
Capybara.current_driver = :selenium
do_some_stuff_with_selenium
}
编辑
糟糕,我刚刚读到这篇文章,所以该解决方案可能行不通。请告诉我
Note: switching the driver creates a new session, so you may not be able to switch in the middle of a test.
我通过创建一个实际的 linkedin 帐户解决了这个问题,将该身份验证信息放在 .env 中,然后调用 fill_in 方法在回调期间填写电子邮件和密码字段。并在整个上下文块中坚持 运行 一个 js 驱动程序。
编辑:这当然不是最佳答案,所以我仍然接受其他答案。
如您所见,您不能 运行 部分测试使用一个驱动程序而部分测试使用另一个驱动程序。这相当于说
Given I login in using Safari.
Then I should be logged in using Firefox.
所以你的解决方法是你必须运行你的测试环境下的js登录代码才能登录。这其实是一件好事(你要测试你的js登录代码)。如果你想避免实际连接到 linkedin,每次你 运行 这个测试,那么你需要模拟到 linkedin 的连接。看一下 VCR (https://github.com/vcr/vcr),这将允许您记录您与 linkedin 的连接,以便在后续测试中 运行s 您不必转到 linkedin。