包括一个模块,除非期望的文件在某个目录中?

时间:2015-10-08 17:25:37

标签: rspec

假设我的项目中有四个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内的所有规格都必须加以标记,我接受这一点。

1 个答案:

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