【问题标题】:Can I eliminate multiple within_frame calls when writing rspec tests for my site?在为我的站点编写 rspec 测试时,我可以消除多个 inside_frame 调用吗?
【发布时间】:2015-11-09 18:19:55
【问题描述】:

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

【问题讨论】:

    标签: ruby unit-testing rspec capybara poltergeist


    【解决方案1】:

    我没有专门尝试过,但你可能可以使用一个环绕钩而不是你的 before(:each) 钩

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

    【讨论】:

    • 谢谢!我刚试了一下,效果很好。我以前从未见过的“环绕”钩子 - 是时候对它进行更多研究了。
    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多