出于某种莫名其妙的原因,RubyMine 会自动保存您所做的每一次更改,因此每次击键都会触发 Guard 运行您的测试!最可笑的是,显然没有办法禁用这个自动保存“功能”。我只是想知道,RubyMine 似乎是 Rails 开发人员中非常流行的编辑器,而 Guard 似乎是用于自动化测试的不可或缺的工具。由于 Guard 无法与 RubyMine 一起合理使用,人们如何处理使用 RubyMine 进行测试的自动化?
5 回答
我整天都在使用 RubyMine 和 Guard,事实上,Guard 的某些部分已经在 RubyMine 本身中开发了。
RubyMine > Preferences
您可以通过进入菜单并sync
在搜索框中输入来配置自动安全行为,然后System Settings
从列表中选择。
图片显示了我的设置,这些工作正常。您可能还想禁用Save files on frame deactivation
, 以仅在手动保存时保存文件。
我更喜欢从终端使用 Guard,但您可以通过从菜单中选择 添加运行配置来配置 RubyMine 以直接运行 Guard:Run > Edit configurations
现在您可以通过单击加号+
并选择来添加新配置IRB console
:
现在命名配置Guard
,在 IRB 脚本中输入 Guard 的路径并设置项目工作目录。您可能希望输入您的 Guard 参数作为 IRB 参数,如不同的 Guard 组等。
我通过打开终端找到了通往 Guard 的路径,更改为项目工作目录并输入which guard
,这导致/Users/michi/.rvm/gems/ruby-1.9.3-p194/bin/guard
我的 Ruby 1.9.3-p194 SDK 由 RVM 管理。
接下来,您需要在选项卡中检查在捆绑包的上下文中运行脚本。Bundler
现在按下OK
,你就有了一个全新的运行配置。在启动 Guard 之前,您应该通过添加将交互器配置为简单
interactor :simple
到你的Guardfile
. 现在您可以直接在 RubyMine 中运行(甚至调试)Guard:
享受!
当您使用 RubyMine 运行guard 进行测试时,为guard spec 配置单独的数据库环境非常有用,否则您会遇到奇怪的问题(一个进程或另一个进程冻结或给出不一致的结果。
将您的保护规范环境命名为“ci”并在 database.yml 中创建一个附加条目。我将“ci”用于持续自动化。
然后把它放在你的 Guardfile 中。关键是
'RAILS_ENV' => 'ci'
这是我的设置:
group :spec do
guard :spork, :rspec_port => 1234, :cucumber_env => { 'RAILS_ENV' => 'ci' }, :rspec_env => { 'RAILS_ENV' => 'ci' } do
watch('config/application.rb')
watch('config/environment.rb')
watch(%r{^config/environments/.+.rb$})
watch(%r{^config/initializers/.+.rb$})
watch('spec/spec_helper.rb')
watch(%r{app/models/.+\.rb})
watch(%r{app/views/.+\.haml})
watch('Gemfile')
watch('Gemfile.lock')
watch('test/test_helper.rb')
end
# environment is 'ci'
guard :rspec, :cli => '--drb --drb-port 1234', :version => 2, :all_after_pass => false, :notification => true, :environment => 'ci' do
watch(%r{^spec/.+_spec.rb$})
watch(%r{^lib/(.+).rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
watch('spec/spec_helper.rb') { "spec" }
# Rails example
watch(%r{^spec/.+_spec.rb$})
watch(%r{^app/(.+).rb$}) { |m| "spec/#{m[1]}_spec.rb" }
watch(%r{^lib/(.+).rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
watch(%r{^app/controllers/(.+)_(controller).rb$}) do |m|
["spec/routing/#{m[1]}_routing_spec.rb",
"spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb",
"spec/acceptance/#{m[1]}_spec.rb",
"spec/requests/#{m[1]}_spec.rb"]
end
watch(%r{^spec/support/(.+).rb$}) { "spec" }
watch('config/routes.rb') { "spec/routing" }
watch('app/controllers/application_controller.rb') { "spec/controllers" }
# Capybara request specs
watch(%r{^app/views/(.+)/.*.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
end
end
然后我跑
bundle exec guard -g spec
我也不介意让 RubyMine 每 60 秒自动保存一次文件,即使这会启动 Guard,因为我的新 MBP Retina 在运行 Guard 时不会明显变慢。
顺便说一句,Guard running specs 真的很棒,因为你会发现失败的测试比尝试在 RubyMine 中自己运行测试要快得多。即,测试基本上是在我的手指从 cmd-s 释放以保存时完成的。
我从终端运行它。我还没有尝试使用 RubyMine 运行。有人想评论这样做的好处吗?我想让堆栈转储可点击会很好。
这是一个非常令人沮丧的问题,并且很难将 RubyMine 与 guard 或 grunt 或其他任务运行器一起使用。
我创建了一个疯狂的解决方法,但它对我来说已经足够好了:
- 添加一个外部工具来运行古老的 Unix“触摸”命令,该命令会更新文件的修改时间戳,从而生成文件系统事件。它应该如下所示:
- 为外部工具分配键盘快捷键。
- 为“保存文档”命令分配键盘快捷键。
- 录制一个运行保存文档的宏,然后是“触摸”外部工具。您需要使用您指定的键盘快捷键,因为保存文档不会出现在应用程序的菜单中。
- 将 Cmd-S 指定为新宏的键盘快捷键。
我关于此的完整博客文章位于http://singlebrook.com/blog/saving-files-in-rubymine
或者,您可以使用以下代码在项目的根目录中添加 run_guard.rb 文件:
exec 'guard'
小心!Rubymine 的 PATH 有问题。例如, /usr/local/bin 被过滤...