用RubyMine使用Guard是不可能的?

时间:2012-08-16 22:06:50

标签: ruby-on-rails rspec tdd rubymine guard

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

5 个答案:

答案 0 :(得分:147)

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

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

Configure RubyMine auto safe behavior

图片显示我的设置,这些工作正常。您可能还想禁用Save files on frame deactivation,仅在手动保存时保存文件。

我更喜欢从终端使用Guard,但您可以通过从菜单中选择Run > Edit configurations来添加运行配置,从而将RubyMine配置为直接运行Guard:

现在,您可以点击加号+添加新配置,然后选择IRB console

Add new run configuration

现在命名配置Guard,输入Guard into IRB脚本的路径并设置项目工作目录。您可能希望将Guard参数作为IRB参数输入,例如不同的Guard组等。

Configure the run configuration

我通过打开终端找到了我的Guard路径,更改为项目工作目录并输入which guard,这导致/Users/michi/.rvm/gems/ruby-1.9.3-p194/bin/guard用于由RVM管理的Ruby 1.9.3-p194 SDK。 / p>

接下来,您需要在Bundler标签中检查在捆绑包的上下文中运行脚本。

Run with bundle exec

现在按OK,您就有了全新的运行配置。在启动Guard之前,您应该通过添加

将交互器配置为简单
interactor :simple

Guardfile。现在,您可以直接在RubyMine中运行(甚至调试)Guard:

Guard in Action

享受!

答案 1 :(得分:4)

当您使用RubyMine运行防护测试时,为防护规范配置单独的数据库环境非常有用,否则您将遇到奇怪的问题(一个进程或其他冻结或给出不一致的结果。

将您的防护规范环境命名为“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时没有明显减慢。

BTW,Guard运行规范真的很棒,因为你会发现失败的测试比尝试在RubyMine中自己运行测试要快得多。即,测试基本上是在我的手指从cmd-s释放到保存时完成的。

我是从终端运行的。我还没有尝试过使用RubyMine。有人想评论这样做的好处吗?我想让堆栈转储可以点击是不错的。

答案 2 :(得分:2)

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

我创建了一些疯狂的解决方法,但它对我来说运作得很好:

  1. 添加外部工具以运行古老的Unix“touch”命令,该命令更新文件的修改时间戳,从而生成文件系统事件。它应该如下所示: External Tool called touch
  2. 为外部工具分配键盘快捷键。
  3. 为“保存文档”命令指定键盘快捷键。
  4. 记录运行“保存文档”的宏,然后“触摸”外部工具。您需要使用指定的键盘快捷键,因为“保存文档”未显示在应用程序的菜单中。
  5. 将Cmd-S指定为新宏的键盘快捷键。
  6. 我的完整博客文章位于http://singlebrook.com/blog/saving-files-in-rubymine

答案 3 :(得分:1)

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

exec 'guard'

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

答案 4 :(得分:0)

我将其作为Gem命令运行,并且该命令还允许我同时使用Bundler,因此Guard的版本适用于该项目。

I run it as a Gem command