在rspec之前使用helper方法:suite block

时间:2015-12-21 19:36:49

标签: ruby rspec

在rspec中使用辅助方法的常见模式如下:

# spec/spec_helper.rb

Dir[File.expand_path(File.join('..', 'support', '**', '*.rb'), __FILE__)].each { |f| require f }

###

# spec/suppport/my_helper.rb

module MyHelper
  def do_something
    # ...
  end
end

我想像这样调用辅助方法:

RSpec.configure do |config|
  config.include MyHelper

  config.before :suite do
    do_something
  end
end

但是当我尝试时,我收到类似undefined local variable or method 'do_something'的错误。我怀疑rspec会进行某种延迟/延迟加载,并且不会立即包含辅助模块。

如果我使用before :each代替before :suite,那么一切都按预期工作。似乎该模块已在before :each次运行时包含在内,但在before :suite次运行时尚未包含。

在我的情况下,该块是幂等的,因此它不会导致before :each出现任何问题,但它的效率非常低,因为它实际上只需要在套件运行之前运行一次,而不是之前每次测试。我在规范中使用了这个方法,所以我认为将它保存在辅助模块中是合适的,但是如何在before :suite块中调用它呢?

我正在使用rspec-core 3.4.1

1 个答案:

答案 0 :(得分:1)

改变这个......

Dir[File.expand_path(File.join('..', 'support', '**', '*.rb'), __FILE__)].each { |f| require f }

到此......

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

也改变了这个......

RSpec.configure do |config|
  config.include MyHelper

  config.before :suite do
    do_something
  end
end

是这个......

RSpec.configure do |config|
  include MyHelper

  config.before :suite do
    do_something
  end
end