Rspec阻止它之间的上下文切换

时间:2013-11-15 22:14:31

标签: ruby testing rspec capybara

我正在尝试在rspec中组合一个运行测试:

feature "Happy Path", js:true do

  before(:all) do
    @user = create(:user)
    @object = create(:object, account: @object.account)
    sign_in @user
  end

  describe "test" do
    context "test" do
      include_examples "it_will_expand_the_menu"

      include_examples "it_will_navigate_to_the_object" do
        let(:object) {@object.name}
      end
    end
  end

并定义了共享示例:

shared_examples "it_will_expand_the_menu" do
  it "expands menu" do
    ...
    ...
  end
end

shared_examples "it_will_navigate_to_the_object" do 
  it "fills in the country" do
    click_on object
  end
end

第一个测试通过菜单扩展,但是在两个测试之间,浏览器刷新并导航到空白HTML页面,然后RSpec出错

Failure/Error: click_on object
     Capybara::ElementNotFound:
       Unable to find link or button "Bicycle"

发生了什么事?为什么RSpec重置上下文,即使我认为include_examples维护当前上下文?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

事实证明这是一个水豚问题。

Capybara :: Session定义了以下方法:

def reset!
      driver.reset! if @touched
      @touched = false
      raise @server.error if Capybara.raise_server_errors and @server and @server.error
    ensure
      @server.reset_error! if @server
    end
    alias_method :cleanup!, :reset!
    alias_method :reset_session!, :reset!

每次测试后spec_helper执行@session.reset_session!

因此,通过附加以下内容:

module Capybara
  class Session
    def reset!
      return nil
    end
  end
end

到我的配置文件的顶部,可以防止这种行为。