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.
Учитывая этот факт, вы должны иметь возможность сделать что-то подобное, чтобы использовать 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.