【问题标题】:capybara/selenium with rspec before :all hook水豚/硒与 rspec 之前:所有挂钩
【发布时间】:2012-03-09 07:01:23
【问题描述】:

为了减少使用 selenium 的页面访问次数,我想从 before :all 钩子中调用 visit 方法,并在单个页面加载的情况下运行我的所有示例。但是,当我指定 before :allbefore :each 时,浏览器会打开,但从未访问过 url。下面是一个简化的、人为的例子……

describe 'foobar', :js => true do
  before :all do
    Capybara.default_wait_time = 10
    obj = Factory(:obj)
    visit obj_path(obj)
  end

  it 'should have foo' do
    page.should have_content('foo')
  end

  it 'should have bar' do
    page.should have_content('bar')
  end
end

当我将它设置为before :each 时,它可以工作,但页面加载了两次。这是Capybara的局限吗?

【问题讨论】:

标签: selenium capybara rspec2


【解决方案1】:

问题原因

第二个示例不起作用,因为 Capybara 在每个 RSpec 示例之后重置会话;您在before :all 块中visit-ed 的页面此时不再打开。这是水豚的明确行为。它在capybara gem 中,在/lib/capybara/rspec.rb 下:

config.after do
  if self.class.include?(Capybara::DSL)
    Capybara.reset_sessions!
    Capybara.use_default_driver
  end
end

我在谷歌上搜索了几个小时,发现其他几个人正在为此苦苦挣扎,但实际上无济于事。

我还发现 patch 允许配置 Capybara 在每个示例被提出后重置会话...但是 Capybara 创建者 jnicklas declined the pull request.

解决方案

我(到目前为止)发现的最快(尽管可能不是最好)可行的解决方案是monkey-patchCapybara:

module Capybara                                                                                                                                                                                  
  class << self                                                                                                                                                                                  
    alias_method :old_reset_sessions!, :reset_sessions!                                                                                                                                          
    def reset_sessions!; end                                                                                                                                                                     
  end                                                                                                                                                                                            
end

这只会让reset_sessions! 在被调用时什么都不做。注意:当心意外的副作用! (如果您需要再次发生默认重置行为,您可以稍后在代码中恢复 alias_method。)

【讨论】:

  • 似乎无法让它工作...... puts 语句将表明该方法确实被覆盖,但这与 before(:all) 结合使用打破了我的所有规范。我发现我的功能规范遵循一种模式:访问页面、执行操作、验证页面内容。为每个 it {} 块重新运行之前的块是没有意义的。测试 JS 的速度已经够慢了……我可能会看看 Riot 测试框架,因为它在每个上下文中只运行一次设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2012-08-22
相关资源
最近更新 更多