капибара / селен с rspec перед: все крючок - PullRequest
13 голосов
/ 09 марта 2012

В попытке уменьшить количество посещений страниц с селеном я хотел вызвать метод посещения из ловушки before :all и запустить все мои примеры с загрузкой одной страницы. Однако когда я указываю before :all против before :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, оно работает, но страница загружается дважды. Это ограничение капибары?

1 Ответ

3 голосов
/ 31 августа 2012

Причина проблемы

Второй пример не работает, потому что Capybara сбрасывает сеанс после каждого примера RSpec;страница, которую вы visit отредактировали в своем блоке before :all, больше не открыта в этот момент.Это явное поведение Капибары.Он находится в жемчужине capybara, под /lib/capybara/rspec.rb:

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

. Я гуглил пару часов и обнаружил, что несколько других борются с этим, но безрезультатно.

Iтакже обнаружил, что патч , который позволит настроить Capybara , а не для сброса сеанса после каждого предложенного примера ... но создатель Capybara jnicklas отклонил запрос на извлечение .

Решение

Самое быстрое - хотя, возможно, и не самое лучшее - работоспособное решение, которое я нашел (пока), - monkey-patch Capybara следующим образом:

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

Это просто заставляет reset_sessions! ничего не делать, когда его вызывают.Примечание: остерегайтесь непреднамеренных побочных эффектов!(Вы всегда можете вернуть alias_method позже в своем коде, если вам нужно, чтобы поведение по умолчанию сбрасывалось снова.)

...