RSpec :: Core :: RakeTask和Pathname / Dir.glob中的模式语法之间的差异

时间:2016-05-19 13:21:37

标签: ruby rspec rake glob rake-task

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

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

1 个答案:

答案 0 :(得分:2)

如何在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它会更清楚,并且会在更多情况下起作用。