Guard-RSpec и Spring: команда `cmd: spring rspec` не запускает спецификации в Guard

Guard-RSpec упоминает в README, что можно запускать спецификации, используя пружину, указав символику cmd:

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 и нажав Enter, он просто говорит мне это:

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

И появляется уведомление типа "Результаты RSpec - Неудачные".

При смене моего Guardfile и удаление spring от RSpec's cmd как это...

guard :rspec, cmd: 'rspec' do

... спецификации запускаются снова, но, видимо, не используют весну?

Я также должен упомянуть, что при запуске spring с терминала OSX ничего не происходит:

$ spring
$ 

Итак: как мне настроить Guard и RSpec для использования Spring?

Обновить

На данный момент я вернул свой bin/spring исполняемый до версии перед "binstubbing" это:

#!/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,

Теперь я абсолютно не уверен, как правильно запустить RSpec с помощью Spring. spring rspec или просто rspec?

1 ответ

Решение

Я изучал эту самую проблему ранее.

Binstubs - это скрипты-обертки вокруг исполняемых файлов. В Rails они живут внутри bin/. Если вы запустите Spring binstub --all, ваши binstubs будут использовать Spring.

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

Учитывая этот факт, вы должны иметь возможность сделать что-то подобное, чтобы использовать Rspec с Spring

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

Небольшой тест для проверки. Убедитесь, что у вас уже есть rspec.

bundle binstubs 'rspec-core'

Убедитесь, что Spring не был загружен в bin / rspec. Следующий блок не должен появляться.

[Бен / RSpec]

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

Отключи весну. Запустите bin / rspec и убедитесь, что Spring не был запущен.

spring stop
spring status
bin/rspec
spring status

Если Spring не был запущен, вы должны увидеть это

Spring is not running.

Теперь загрузите ваши binstubs с помощью Spring. Убедитесь, что у вас уже установлены необходимые гемы.

[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

Отключи весну. Запустите bin / rspec и убедитесь, что Spring был запущен.

spring stop
spring status
bin/rspec
spring status

Теперь проверьте, не запускаются ли тесты быстрее после того, как Spring загрузит среду для тестов.

spring stop
time bin/rspec

[выход]

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

Весна должна быть запущена сейчас. Давайте посмотрим, выполняет ли он свою работу.

time bin/rspec

[выход]

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

Ага.

В итоге, если ваши binstubs были загружены с помощью Spring, вызов binstubs будет включать Spring. И, конечно же, только команды, зарегистрированные в Spring, могут использовать Spring, поэтому spring-commands-rspec была включена в Gemfile ранее для поддержки Rspec.

Другие вопросы по тегам