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

时间:2015-11-09 18:19:55

标签: ruby unit-testing rspec capybara poltergeist

我正在使用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)一次并让所有测试都遵循该声明?

1 个答案:

答案 0 :(得分:1)

我还没有特别尝试过,但你可以使用一个钩子而不是你之前的(:每个)钩子

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