我正在尝试在我的Exercism文件夹中设置Guard,以便所有测试都自动运行(使用guard-minitest).
文件夹结构如下所示:
.
??? exercism
??? ruby
??? bob
? ??? bob.rb
? ??? bob_test.rb
??? etl
? ??? etl.rb
? ??? etl_test.rb
...
??? binary_search_tree
??? bst.rb
??? binary_search_tree.rb
??? README.md
由于不常见的文件夹结构,我在Guardfile中进行了以下配置:
# tell Guard to watch all folders under ruby/ all_dirs = Dir.glob('ruby/*') directories all_dirs options = { test_folders: all_dirs, test_file_patterns: '*_test.rb', pride: true } guard :minitest, options do watch(%r{^ruby/([^/]+)/([^/]+).rb$}) end
通过此设置,我希望在对.rb文件进行任何编辑后运行所有测试.
我在调试模式下运行后卫.
正如所料,所有测试都在启动时运行.
但是,当我编辑.rb文件时,测试不会再次运行,尽管Guard输出:
20:43:26 - DEBUG - Interactor was stopped or killed
20:43:26 - DEBUG - Hook :run_on_additions_begin executed for Guard::Minitest
20:43:26 - DEBUG - Hook :run_on_additions_end executed for Guard::Minitest
20:43:26 - DEBUG - Start interactor
我在防护配置中尝试了很多变化,例如:
watch(%r{^ruby/([^/]+)/([^/]+).rb$}) do |m| Dir.glob("ruby/#{m[1]}/*_test.rb").first end
(我希望这只能从修改文件的文件夹中运行测试.)
似乎没什么用.我必须去守卫的交互式控制台并按下ENTER以运行测试.
我究竟做错了什么?
在阅读下面的Cezary的答案之后,我尝试了更多的东西,包括在其他环境中尝试这个.
事实证明这不是警卫的错,但可能是我正在使用的环境.
我最初在Codio盒子里运行了所有东西.我将项目移动到其他两台机器,一台Win8和一台Ubuntu 14.04,并且它在使用这个Guardfile时都能正常工作:
all_dirs = Dir.glob('ruby/*') directories all_dirs clearing :on options = { test_folders: all_dirs, test_file_patterns: '*_test.rb', pride: true } guard :minitest, options do watch(%r{^ruby/([^/]+)/([^/]+).rb$}) do |m| file = Dir.glob("ruby/#{m[1]}/*_test.rb").first puts " Should test #{file}" file end end
输出guard -d
如下:
在Codio盒子里(它不起作用):
08:55:09 - DEBUG - Interactor was stopped or killed Should test ruby/anagram/anagram_test.rb 08:55:09 - DEBUG - Hook :run_on_additions_begin executed for Guard::Minitest 08:55:09 - DEBUG - Hook :run_on_additions_end executed for Guard::Minitest 08:55:09 - DEBUG - Start interactor [1] guard(main)>
在Win/Ubuntu上(它工作正常):
11:02:10 - DEBUG - Interactor was stopped or killed Should test ruby/anagram/anagram_test.rb 11:02:10 - DEBUG - Hook :run_on_modifications_begin executed for Guard::Minitest 11:02:10 - INFO - Running: ruby/anagram/anagram_test.rb Run options: --seed 52507 # Running tests: .......... Finished tests in 0.001249s, 8006.0205 tests/s, 8006.0205 assertions/s. 10 tests, 10 assertions, 0 failures, 0 errors, 0 skips 11:02:10 - DEBUG - Hook :run_on_modifications_end executed for Guard::Minitest 11:02:10 - DEBUG - Start interactor [1] guard(main)>
我不知道为什么在Codio上我得到run_on_additions
了,另外两个我得到了run_on_modifications
.无论如何,我猜这是一个Codio问题.我尝试使用和不使用手动保存,它也是一样的.
嗨,我是Guard的"责备人"之一,基于此,我写了一个演练:https://github.com/guard/guard/wiki/Understanding-Guard
我强烈建议通过它(反馈意见).
以下列出了需要考虑的事项:
结构:如果可以的话,将测试放在一个单独的顶级文件夹中,理想情况下,在您的示例中为'ruby/test',以及'ruby/lib'中的文件.这更接近于惯例,然后像Guard::Minitest
开箱即用的东西.(有些编辑器 - 比如Vim和Emacs - 允许你在"替代"文件之间切换,他们会自动知道在哪里寻找测试或实现文件).
Guard递归地监视目录(现在甚至无法关闭).对于小型项目,您可以通过不指定directories
选项来查看所有内容.但是,如果您的文件夹中有大量磁盘活动,并且您有大型项目,则需要选择目录.例如,在你的情况下,它将是:directories ruby
.所以`Dir.glob('ruby/*')在这里没有多大意义.
Guard :: Minitest选项 - 如果你使用我描述的结构,这不是必需的.如果没有,我认为test_folder: %w(ruby)
应该足够了.此外,test_file_patterns
不应该是必要的,因为你的文件似乎遵循默认/约定(bob_test.rb
和etl_test.rb
) -除非你有一些奇怪的东西具有测试套件内的bob.rb
和etl.rb
文件.
您的监视表达式没有阻止,因此它返回已更改的文件.不幸的是,当你更改一个实现文件(比如bob.rb
)时,会传递该文件Guard::Minitest
,忽略非测试文件(可能使用该test_file_patterns
选项,所以因为bob.rb
不匹配bob_test.rb
,所以Guard :: Minitest会悄悄地做......没有.
理想情况下,重命名你的Guardfile
,更新你的宝石(Guard::Minitest
基本上)并运行bundle exec guard init minitest
到那么"当前"推荐的模板是什么,Guard::Minitest
并尝试调整它.您会看到默认值为:
watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
它显示了如何将更改的实现文件转换为测试文件(这是唯一关注的文件Guard::Minitest
).
在您的情况下,您可能需要:
watch(%r{^ruby/(.*/)?([^/]+)\.rb$}) { |m| "ruby/#{m[1]}/#{m[2]}_test.rb" }
我想说的是使用regexen可怕 - 我计划实施glob模式支持 - 但是这将需要一段时间(许多关键bug修复的管道对我来说).
如果这没有帮助 - 肯定要通过上面的Wiki文档,因为你可以使用Guard/Listen大约有20-50个问题 - 而且大多数都完全在Guard/Listen的控制之外.(我希望我可以改变它以使其更简单,所以任何建议都会有所帮助).
由于错误是我的优先考虑,像大多数维护者一样 - 我们依赖于GitHub报告的问题.因此我们通常不会在Stack Overflow中观察内容(我们希望在Github中报告棘手的问题).
好吧,我已经指出了很多错误,你做的非常非常好的时间:
Guard
在调试模式下运行- 你真的很棒
显示有关更改的输出 - 您也很棒(因为这表明Guard :: Minitest正在获取更改,但它忽略了它们 - 可能因为您传递的是实现文件而不是测试文件).
提交这样一个详细的问题 - 这非常有帮助.理想情况下,你不应该经历所有麻烦(或者甚至首先遇到问题),但通过报告这一点,你向我们展示了Guard在这么多层面上的问题.(通常,作为开发人员/维护人员,我们"得到"内部人员,因此我们立即"知道"什么是错误的 - 即使文档或消息或调试输出对其他人没有任何意义 - 所以这样的问题可以帮助我们非常帮助其他人).
再次感谢您 - 如果您看到其他人有问题可以解决 - 请这样做.如果您在Guard中看到明显的错误或问题 - 请在Guard中打开一个问题.如果它在另一个插件库(如Guard::Minitest
)中,请提及我,以免重要问题被忽略(@e2
在GitHub上提到我).
我希望能让Guard变得更好 - 目前我正在努力使其变得更简单,更直观,更灵活,更可靠.我可以依靠报道破碎东西的人越多,我就能越快地推进酷炫的东西.
再次感谢,祝你有个美好的一天!