Guard-RSpec和Spring:命令`cmd:spring rspec`不在Guard中运行规范

时间:2014-03-11 13:42:48

标签: ruby-on-rails spring rspec guard

Guard-RSpec在README中提到可以通过指定cusom cmd来使用spring运行规范:

guard :rspec, cmd: 'spring rspec' do
  # ...
end

过去工作正常,直到我执行spring binstub --all改变了我的bin/spring ...

#!/usr/bin/env ruby
#
# This file was generated by Bundler.
#
# The application 'spring' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'pathname'
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
  Pathname.new(__FILE__).realpath)

require 'rubygems'
require 'bundler/setup'

load Gem.bin_path('spring', 'spring')

...到...

#!/usr/bin/env ruby

# This file loads spring without using Bundler, in order to be fast
# It gets overwritten when you run the `spring binstub` command

unless defined?(Spring)
  require "rubygems"
  require "bundler"

  if match = Bundler.default_lockfile.read.match(/^GEM$.*?^    spring \((.*?)\)$.*?^$/m)
    ENV["GEM_PATH"] = ([Bundler.bundle_path.to_s] + Gem.path).join(File::PATH_SEPARATOR)
    ENV["GEM_HOME"] = ""
    Gem.paths = ENV

    gem "spring", match[1]
    require "spring/binstub"
  end
end

现在,在运行guard并点击输入时,它只是告诉我:

[2] guard(main)>                     <<<<< pressing enter
14:35:35 - INFO - Run all
14:35:35 - INFO - Running all specs

并发出类似&#34; RSpec结果的通知 - 失败&#34;出现。

更改我的Guardfile并从RSpec spring删除cmd时,这样......

guard :rspec, cmd: 'rspec' do

......规格再次运行,但显然没有使用弹簧?

我还必须提到,当从OSX终端运行spring时,似乎没有任何事情发生:

$ spring
$ 

那么:我如何配置Guard和RSpec来使用Spring?

更新

目前,我已将bin/spring可执行文件还原为&#34; binstubbing&#34;之前的版本。它:

#!/usr/bin/env ruby
#
# This file was generated by Bundler.
#
# The application 'spring' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'pathname'
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
  Pathname.new(__FILE__).realpath)

require 'rubygems'
require 'bundler/setup'

load Gem.bin_path('spring', 'spring')

Guardfile看起来像这样:

guard :rspec, cmd: 'spring rspec' do ... end

这很有效,但我认为它比运行裸rspec更快。

所以我现在绝对不确定如何使用Spring正确运行RSpec - 使用spring rspecrspec

1 个答案:

答案 0 :(得分:4)

我之前正在研究这个问题。

  

Binstubs是围绕可执行文件的包装脚本。他们住在Rails   在bin /中。如果你运行spring binstub --all,那么你的binstub将会是   使用Spring。

http://makandracards.com/makandra/26083-3-ways-to-run-spring-the-rails-app-preloader-and-how-to-disable-it

鉴于这一事实,你应该可以做这样的事情来使用Rspec with Spring

guard :rspec, cmd: "bin/rspec" do

验证一点点测试。确保你已经有了binstubbed rspec。

bundle binstubs 'rspec-core'

验证Spring是否未在bin / rspec中引导。不应出现以下块。

[二进制/ rspec的]

begin
  load File.expand_path("../spring", __FILE__)
rescue LoadError
end

关闭Spring。运行bin / rspec并验证Spring是否未被触发。

spring stop
spring status
bin/rspec
spring status

如果没有触发Spring,你应该看到这个

Spring is not running.

现在使用Spring引导你的binstubs。确保您已经安装了必要的宝石。

[Gemfile中]

group :development, :test do
  gem "rspec-rails", "~> 3.0"
  gem 'spring-commands-rspec'
  ...
end

[终端]

bundle install

更新binstubs以使用Spring

spring binstub --all

验证Spring是否已在bin / rspec中引导。现在应该出现以下块。

[二进制/ rspec的]

begin
  load File.expand_path("../spring", __FILE__)
rescue LoadError
end

关闭Spring。运行bin / rspec并验证是否已触发Spring。

spring stop
spring status
bin/rspec
spring status

现在检查弹簧加载测试环境后测试是否运行得更快。

spring stop
time bin/rspec

[输出]

real    0m4.981s
user    0m0.144s
sys 0m0.032s

Spring现在应该运行了。让我们看看它是否正在发挥作用。

time bin/rspec

[输出]

real    0m0.831s
user    0m0.140s
sys 0m0.034s

是的。

最重要的是,如果您的binstubs已经使用Spring引导,则调用binstub将包含Spring。当然,只有已经在Spring中注册的命令才能使用Spring,这就是为什么spring-commands-rspec早先包含在Gemfile中以支持Rspec的原因。