rspec测试:put:js => true也会影响前块

时间:2015-01-04 08:07:53

标签: javascript ruby-on-rails rspec linkedin-gem

我有一个用于预约的页面,它有一些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 =>这是真的围绕它,它要求我通过linkedin,http://imgur.com/mYUOxgD

登录

我想知道是否有人知道如何解决这个问题。

以下是可能与此问题相关的其他文件。

spec_helper.rb

require 'capybara/webkit/matchers'
Capybara.javascript_driver = :webkit

的Gemfile

gem 'capybara-webkit'
gem 'database_cleaner'
gem 'capybara'

3 个答案:

答案 0 :(得分:1)

正如您所发现的那样,您无法使用一个驱动程序运行部分测试,而使用另一个驱动程序执行部分测试。这相当于说

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的连接,以便在后续的测试运行中您不必转到linkedin。

答案 1 :(得分:0)

在rspec块中设置js: true是在整个示例中使用启用了javascript的驱动程序的快捷方式。所以这个驱动程序将在整个执行或示例中可用并使用,其中包括所有之前/之后/周围的块。

要解决此问题,您可以手动设置在您需要的示例点使用哪个驱动程序,而不是使用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
}

修改

哎呀我刚看过这个,所以也许这个解决方案不会起作用。请让我知道

  

注意:切换驱动程序会创建一个新会话,因此您可能无法在测试过程中切换。

答案 2 :(得分:0)

我通过创建一个实际的linkedin帐户解决了这个问题,将该身份验证信息放在.env中,然后调用fill_in方法在其回调期间填写电子邮件和密码字段。并坚持在整个上下文块中运行js驱动程序。

编辑:这当然不是最佳答案,所以我仍然接受其他答案。