在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
。
答案 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