如果我执行.glob('**/spec')
,那么递归部分将保证捕获当前目录中名为spec
的目录。如果我使用task.pattern = '**/spec/**/*_spec.rb'
执行RSpec::Core::RakeTask
,则不会执行当前目录中的内部测试。如果模式为spec/**/*_spec.rb
,则为。 RSpec::Core::RakeTask
和.glob
中的模式有何不同?为什么?
根据文档,RSpec的默认模式为**/*_spec.rb
。为什么这与spec/**{,/*/**}/*_spec.rb
的默认RSpec::Core::RakeTask
不同(具体为**
与**{,/*/**}
;我认为这与第一个问题有关)?
答案 0 :(得分:2)
如何在RSpec::Core::RakeTask
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
它会更清楚,并且会在更多情况下起作用。