我正在编写一个旨在从命令行运行的Ruby脚本。该脚本具有相应的RSpec文件,用于验证其功能。文件夹结构是:
./main_script.rb
./spec/main_script_spec.rb
在顶级目录中运行rspec spec
按预期工作。显示./spec/main_script_spec.rb
文件的测试结果。每次我更改主脚本文件或spec文件时,我都希望避免手动运行。我的所有搜索结果都显示guard之类的东西(据我所知)都是为Rails应用程序设计的。
如何设置RSpec以监视脚本或规范更改并使用非Rails Ruby代码自动运行?
答案 0 :(得分:7)
就像大卫所说,Guard可用于观看各种文件,并在修改这些文件时执行操作。它不必与Rails应用程序一起使用。我使用guard
在过去设置了类似的内容。这是我做的:
将以下内容放入Gemfile
:
source 'https://rubygems.org'
gem 'guard'
gem 'guard-shell'
gem 'rspec'
gem 'rb-fsevent', '~> 0.9'
然后运行:
$ bundle install
使用以下命令在主目录中创建Guardfile:
$ guard init
在Guardfile
中,注释掉示例并添加:
guard :shell do
watch(%r{^*\.rb}) { `bundle exec rspec spec/` }
end
这告诉guard要监视目录中任何ruby文件的修改,并在它们发生更改时执行命令bundle exec rspec spec/
(反引号用于在shell中执行命令)。
然后在当前目录中打开一个新的终端窗口并启动guard
服务器以开始观看文件:
$ bundle exec guard
现在,当你修改目录中的ruby文件时,你的Rspec测试套件会自动运行。
答案 1 :(得分:2)
Guard可用于普通的旧红宝石。我一般都有后卫的问题所以我喜欢使用watchr,另一个宝石。使用几行代码,您可以告诉监视器监视文件的更改并在更改时运行命令。
有关普通红宝石护卫的例子,请参阅shuhari宝石。
关于watchr gem的更新:这个gem似乎有an issue,也许版本为ruby> = 2.0。 observr gem解决了这个问题,并在ruby 2.3中按预期工作。
答案 2 :(得分:0)
我已经使用guard和guard-rspec添加了很好的结果,我不相信它是特定于Rails的。其他Ruby / RSpec项目应该同样有效。
guard documentation建议使用Bundler并“始终通过Bundler运行Guard以避免错误”。即你通过你的Gemfile安装它并始终使用bundle exec guard
运行它(或使用rubygems-bundler来避免bundle exec部分。)
答案 3 :(得分:0)
过去我使用了guard,但现在我使用了rspec focus feature 和watch 命令的组合。
很简单,只需在要运行测试的 f
块的 describe
之前添加一个 it
。所以它会变成 fdescribe
或 fit
块。这与向块添加标签 :focus => true
相同。
然后我们可以使用焦点标签过滤规格:rspec -t focus
现在,为了使用焦点标签保持运行这些规范(每 0.5 秒),我们使用 watch
命令调用它:
watch -n 0.5 rspec -t focus
但是这样输出不会显示颜色。所以,我们需要使用 unbuffer。
sudo apt-get install expect
稍加定制:
watch -n 0.5 --color 'unbuffer bundle exec rspec -t focus'
由于输入这些很烦人,我在我的 ~/.bash_aliases
文件中创建了两个别名(您也可以使用 .bashrc
):
alias focus="watch -n 0.5 --color 'unbuffer bundle exec rspec -t focus'"
alias focuss="bundle exec rspec -t focus"
现在我可以输入 focus
来继续运行它,或者对于单个焦点执行我输入 focuss