RSpec::Core::RakeTask 和 Pathname/Dir.glob 中模式语法的区别

Difference between pattern syntax in RSpec::Core::RakeTask and Pathname/Dir.glob

  1. 如果我执行 .glob('**/spec') 那么递归部分保证将捕获当前目录中名为 spec 的目录。如果我使用 RSpec::Core::RakeTask 执行 task.pattern = '**/spec/**/*_spec.rb',则不会执行当前目录中 spec 内的测试。如果模式是 spec/**/*_spec.rb,它们将是。 RSpec::Core::RakeTask.glob 中的模式有什么区别,为什么?

  2. 根据文档,RSpec 的默认模式是 **/*_spec.rb。为什么这与 RSpec::Core::RakeTask 的默认 spec/**{,/*/**}/*_spec.rb 不同(特别是 ****{,/*/**};我认为这与第一个问题有关)?

如何在 RSpec::Core::RakeTask

中使用 glob 模式

RSpec::Core::RakeTask 只运行 rspec 可执行文件。设置任务的模式只是通过带有 --pattern 标志的模式。

RSpec 首先构造一个路径列表,在其中查找规范。如果命令行中没有给出文件或目录,则使用单个默认路径 'spec'。 RSpec 在每个路径中查找模式。 If the pattern begins with the path, RSpec just globs the pattern. If the pattern doesn't begin with the path, RSpec prepends the path to the pattern. 所以:

  • 模式 **/spec/**/*_spec.rb 以通配符开头,因此 RSpec 在路径前面,而 ​​spec/**/spec/**/*_spec.rb 不匹配任何内容。
  • 模式 spec/**/*_spec.rb 以路径开头,因此 RSpec 只需使用它就可以了。

模式**/*_spec.rb也可以; RSpec 会在前面加上 spec/.

RSpec::Core::RakeTask的默认模式

This part of the pattern **{,/*/**} allows it to follow symlinks. 我不知道为什么 RSpec::Core::RakeTask 默认遵循符号链接而命令行 rspec 不遵循。

我相信 rake 任务的默认模式之所以有效,是因为 RSpec 认识到它以路径开头,而不是在路径前面。我认为如果它是 **{,/*/**}/*_spec.rb 它会更清晰并且可以在更多情况下工作。