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。