在为我的站点编写 rspec 测试时,我可以消除多个 within_frame 调用吗?

Can I eliminate multiple within_frame calls when writing rspec tests for my site?

我正在使用 Capybara + Rspec 为旧版应用程序编写测试,我发现我的所有测试都需要 运行 在特定的框架内。我在每次测试前写了一些 rspec 帮助程序 运行 以确认我正确设置了会话,然后访问 URL:

def set_session
    Capybara.register_driver :poltergeist do |app|
      Capybara::Poltergeist::Driver.new(
          app,
          window_size: [1280, 1024] ,
          timeout: 60 
         )   
    end
    Capybara.javascript_driver = :poltergeist

    @sess = Capybara::Session.new :poltergeist
    #authentication stuff here...
end

describe 'initiate_requests' do
  before(:all) do
    set_session
  end

  before(:each) do
    @sess.visit(URL)    
  end


  it 'shows error if not degree seeking student' do
    @sess.within_frame(FRAME) {
      set_test_vars(FAILID)
      expect(@sess).to have_selector("#NO_PROGRAM_ERROR")
      expect(@sess).not_to have_selector("#submitButton")
    }
  end

  it 'works for a degree seeking student' do
    @sess.within_frame(FRAME) {
      set_test_vars(VALIDID)
      expect(@sess).not_to have_selector("#NO_PROGRAM_ERROR")
      expect(@sess).to have_selector("#submitButton")
    }
  end
end

这很好用。但是,我需要以以下形式编写的每个测试:

      it 'works for a degree seeking student' do
        @sess.within_frame(FRAME) {
          #do tests..
        }
      end

有什么方法可以重置@sess 使其始终在框架内工作吗?缺少它,有什么方法可以只声明一次 @sess.within_frame(FRAME) 并让所有测试都遵循该声明?

我没有专门尝试过,但你可以使用 around hook 而不是 before(:each) hook

around(:each) do |example|
  @sess.visit(URL)
  @sess.within_frame(FRAME) do
    example.run
  end
end