假设我的项目中有四个spec文件:
spec/foo/foo_one_spec.rb
spec/foo/foo_two_spec.rb
spec/baz/baz_one_spec.rb
spec/baz/baz_two_spec.rb
如果当前规范文件在baz目录中不是,我怎样才能配置我的spec文件以包含某个模块?
这里有一些伪代码来说明:
module Moddy
extend RSpec::SharedContext
let(:message){ 'hello' }
before{ puts message }
end
RSpec.configure do |c|
# path is pseudo-code; pretending it returns the path of the current expectation
c.include Moddy unless path.includes?('/baz/')
end
因此,在运行我的规范时,除了文件'hello'
和baz_one_spec
内的内容之外,我希望在每次预期之前将baz_two_spec
打印到屏幕上。
如果这不可能,您能告诉我如何使用标签实现这一目标吗? baz
内的所有规格都必须加以标记,我接受这一点。
答案 0 :(得分:1)
使用Frederick Cheung's idea运行,我想出了如何自动定义目录的元数据,然后您可以有条件地使用该元数据包含模块。这取决于rspec-rails
infers spec type from file location。
我正在处理两个简单的规范:
# spec/foo/foo_spec.rb
require 'spec_helper'
describe 'Foo' do
it 'printed something before the test ran' do
expect(1).to eq(1)
end
end
# spec/bar/bar_spec.rb
require 'spec_helper'
describe 'Bar' do
it 'did not print anything before the test ran' do
expect(1).to eq(1)
end
end
在spec_helper
中,我复制了您的Moddy
并使用define_derived_metadata标记spec/foo
中的标记文件:
# spec/spec_helper.rb
RSpec.configure do |config|
config.define_derived_metadata(file_path: %r(spec/foo)) do |metadata|
metadata[:include_moddy] = true
end
config.include Moddy, include_moddy: true
end
file_path
选项接受正则表达式以匹配并运行块。这个接受spec/foo
,但您可以接受其他所有内容,或者您可以在rspec-rails
目录列表中为DIRECTORY_MAPPINGS
创建表达式。
之后,这是规范运行的样子:
$ rspec
Bar
did not print anything before the test ran
Foo
hello
printed something before the test ran
Finished in 0.00101 seconds (files took 0.07205 seconds to load)
2 examples, 0 failures