53

出于某种莫名其妙的原因,RubyMine 会自动保存您所做的每一次更改,因此每次击键都会触发 Guard 运行您的测试!最可笑的是,显然没有办法禁用这个自动保存“功能”。我只是想知道,RubyMine 似乎是 Rails 开发人员中非常流行的编辑器,而 Guard 似乎是用于自动化测试的不可或缺的工具。由于 Guard 无法与 RubyMine 一起合理使用,人们如何处理使用 RubyMine 进行测试的自动化?

4

5 回答 5

149

我整天都在使用 RubyMine 和 Guard,事实上,Guard 的某些部分已经在 RubyMine 本身中开发了。

RubyMine > Preferences您可以通过进入菜单并sync在搜索框中输入来配置自动安全行为,然后System Settings从列表中选择。

配置 RubyMine 自动安全行为

图片显示了我的设置,这些工作正常。您可能还想禁用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

使用 bundle exec 运行

现在按下OK,你就有了一个全新的运行配置。在启动 Guard 之前,您应该通过添加将交互器配置为简单

interactor :simple

到你的Guardfile. 现在您可以直接在 RubyMine 中运行(甚至调试)Guard:

警卫在行动

享受!

于 2012-08-17T06:27:14.283 回答
4

当您使用 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 运行。有人想评论这样做的好处吗?我想让堆栈转储可点击会很好。

于 2012-10-29T21:27:01.917 回答
4

这是一个非常令人沮丧的问题,并且很难将 RubyMine 与 guard 或 grunt 或其他任务运行器一起使用。

我创建了一个疯狂的解决方法,但它对我来说已经足够好了:

  1. 添加一个外部工具来运行古老的 Unix“触摸”命令,该命令会更新文件的修改时间戳,从而生成文件系统事件。它应该如下所示: 称为触摸的外部工具
  2. 为外部工具分配键盘快捷键。
  3. 为“保存文档”命令分配键盘快捷键。
  4. 录制一个运行保存文档的宏,然后是“触摸”外部工具。您需要使用您指定的键盘快捷键,因为保存文档不会出现在应用程序的菜单中。
  5. 将 Cmd-S 指定为新宏的键盘快捷键。

我关于此的完整博客文章位于http://singlebrook.com/blog/saving-files-in-rubymine

于 2015-06-15T21:09:48.447 回答
1

或者,您可以使用以下代码在项目的根目录中添加 run_guard.rb 文件:

exec 'guard'

小心!Rubymine 的 PATH 有问题。例如, /usr/local/bin 被过滤...

于 2012-10-10T11:40:16.717 回答
0

我将它作为一个Gem命令运行,它允许我同时利用 Bundler,因此 Guard 的版本对于项目是正确的。

我将它作为 Gem 命令运行

于 2020-10-07T10:24:21.380 回答