【问题标题】:rspec testing: putting :js => true also affects the before blockrspec 测试:放置 :js => true 也会影响 before 块
【发布时间】:2015-01-09 08:14:17
【问题描述】:

我有一个用于预约的页面,它有一些 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'

【问题讨论】:

  • 你试过在上下文块中设置 js: true 而不是 it 块吗?
  • 是的,这并没有解决问题。
  • 您忘记启用模拟了吗? OmniAuth.config.test_mode = true(见github.com/intridea/omniauth/wiki/Integration-Testing
  • 不。在 spec_helper.rb 中设置

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


【解决方案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。

【讨论】:

    【解决方案2】:

    在您的 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
    }
    

    编辑

    糟糕,我刚读到这个,所以这个解决方案可能不起作用。请告诉我

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多