当普通的Ruby(而不是Rails)文件发生变化时自动运行RSPec

时间:2013-07-31 15:21:52

标签: ruby rspec

我正在编写一个旨在从命令行运行的Ruby脚本。该脚本具有相应的RSpec文件,用于验证其功能。文件夹结构是:

./main_script.rb
./spec/main_script_spec.rb

在顶级目录中运行rspec spec按预期工作。显示./spec/main_script_spec.rb文件的测试结果。每次我更改主脚本文件或spec文件时,我都希望避免手动运行。我的所有搜索结果都显示guard之类的东西(据我所知)都是为Rails应用程序设计的。

如何设置RSpec以监视脚本或规范更改并使用非Rails Ruby代码自动运行?

4 个答案:

答案 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)

我已经使用guardguard-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。所以它会变成 fdescribefit 块。这与向块添加标签 :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