我遇到了一个问题,我的测试设置中的所有内容,包括 Spork 的 prefork 块,都会在每次运行时重新加载和调用。即使这是一个新项目,但在 guard 收到更改后,测试需要 5-8 秒才能启动,因此测试最少,我什至有一个 SSD。
在我意识到一切都在重新加载之前,我使用 Jo Liss 描述的技术对其进行了分析 here我已经包括了那些挂起的要求,但显然这没有帮助,因为无论如何它都被重新加载了。然而,就在那时我注意到了这一点:
Loaded Suite test,test/controllers,test/controllers/manage,test/factories,test/functional/manage,test/helpers,test/helpers/manage,test/integration,test/models,test/support
我不明白为什么它会重新加载所有内容。这是我第一次尝试设置 minitest+spork+guard(我应该刚刚使用 rspec,叹气)所以我希望它是愚蠢的。我将所有内容都包括在内,希望有人遇到过或者可以轻松发现我错过的内容。提前致谢!
我的文件包括:
test_helper.rb
require 'spork'
Spork.prefork do
#MiniTest::Rails.override_testunit!
ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'guard'
require 'guard/interactors/readline'
require 'guard/ui'
require 'guard/interactors/coolline'
require 'guard/interactor'
require 'guard/dsl'
require 'guard/notifiers/rb_notifu'
require 'guard/notifier'
require 'guard/minitest/notifier'
require 'guard/minitest/runners/default_runner'
Dir[File.expand_path('test/support/*.rb')].each { |file| require file }
require "mocha"
Spork.trap_method(Rails::Application, :reload_routes!)
Spork.trap_method(Rails::Application::RoutesReloader, :reload!)
end
Guardfile
guard 'bundler' do
watch('Gemfile')
# Uncomment next line if Gemfile contain `gemspec' command
# watch(/^.+\.gemspec/)
end
guard 'spork', :wait => 65, :test_unit => false, :minitest => true, :minitest_env => { 'RAILS_ENV' => 'test' }, :bundler => true do
watch('config/application.rb')
watch('config/environment.rb')
watch(%r{^config/environments/.+\.rb$})
watch(%r{^config/initializers/.+\.rb$})
watch('Gemfile')
watch('Gemfile.lock')
watch('test/test_helper.rb') { "test" }
end
guard 'minitest' do
watch(%r|^test/test_helper\.rb|) { "test" }
watch(%r|^test/support/(.*)\.rb|) { "test" }
watch(%r{^test/.+_test\.rb$})
watch(%r|^app/models/(.*)\.rb|) {|m| ["test/models/#{m[1]}_test.rb", "test/integration/#{m[1]}_test.rb"] }
watch(%r|^app/controllers/(.*)\.rb|) {|m| ["test/controllers/#{m[1]}_test.rb", "test/integration/#{m[1]}_test.rb"] }
watch(%r|^app/views/(.*)\.html|) {|m| "test/integration/#{m[1]}_test.rb" }
watch(%r|^app/objects/(.*)\.rb|) {|m| "test/objects/#{m[1]}_object_test.rb" }
end
guard 'livereload' do
watch(%r{app/.+\.(erb|haml)})
watch(%r{app/helpers/.+\.rb})
watch(%r{(public/|app/assets).+\.(css|js|html)})
watch(%r{(app/assets/.+\.css)\.scss}) { |m| m[1] }
watch(%r{(app/assets/.+\.js)\.coffee}) { |m| m[1] }
watch(%r{config/locales/.+\.yml})
end
support/minitest.rb
#require "minitest/autorun"
require "minitest/rails"
require "minitest/spec"
require "minitest/pride"
require "minitest/rails/shoulda"
require "minitest/autorun"
require "capybara/rails"
class RequestSpec < MiniTest::Spec
include Rails.application.routes.url_helpers
include Capybara::DSL
include Rails.application.routes.url_helpers
end
MiniTest::Spec.register_spec_type /integration$/i, RequestSpec
#MiniTest::Spec.register_spec_type /object$/, MiniTest::Spec
class MiniTest::Rails::Controller
include Devise::TestHelpers
end
support/turn.rb
require 'turn'
require 'turn/autorun'
require 'turn/colorize'
require 'turn/reporter'
require 'turn/reporters/pretty_reporter'
Turn.config do |c|
c.natural = true
c.ansi = true
c.format = :pretty
end
Gemfile
source 'https://rubygems.org'
# core
gem 'rails', '3.2.8'
gem 'thin'
# infrastructure
gem 'heroku'
gem 'foreman', :groups => [:development, :test]
# application monitoring
gem 'airbrake'
gem 'newrelic_rpm'
# view engine
gem 'haml', '>= 3.1.7'
gem 'haml-rails', '>= 0.3.5'
gem 'redcarpet' # markdown
# data persistence
gem 'mongoid', '>= 3.0.5'
gem 'redis'
gem 'redis-store'
gem 'redis-rails'
# email
gem 'sendgrid'
gem 'mailcatcher', :group => [:development]
# authentication and authorization
gem 'devise', '>= 2.1.2'
gem 'omniauth', '>= 1.0'
#gem 'authority'
gem 'cancan'
gem 'rolify', '>= 3.2.0'
# view helpers
gem 'bootstrap-generators', '~> 2.1', :group => [:development]
gem 'jquery-rails'
gem 'simple_form', '>= 2.0.2'
gem 'rails3-jquery-autocomplete'
# file attachments
gem 'rmagick'
gem 'fog'
gem 'carrierwave'
gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid'
# url helpers
gem 'mongoid_slug'
# console tools
gem 'ansi', :groups => [:development, :test]
gem 'rack-livereload', :groups => [:development]
gem 'pry-rails', :groups => [:development]
gem 'growl', :groups => [:development, :test]
gem 'turn', :groups => [:test]
gem 'awesome_print'
gem 'progress_bar', :groups => [:test]
# supporting libraries
gem 'bson_ext'
gem 'nokogiri', :group => :test
gem 'ruby_parser', '>= 2.3.1', :group => :test
gem 'rb-fsevent', '~> 0.9.1', :group => :development
# assets
gem 'less-rails', :group => :assets
gem 'therubyracer', '>= 0.10.2', :group => :assets
gem 'uglifier', '>= 1.0.3', :group => :assets
# guard
gem 'guard', :group => :development
gem 'guard-livereload', :group => :development
gem 'guard-spork', :group => :development
gem 'guard-minitest', :group => :development
gem 'guard-bundler', :group => :development
# minitest
gem 'spork-minitest', :group => :test
gem 'minitest-rails', :group => :test
gem 'minitest-rails-shoulda', :group => :test, :git => 'git://github.com/rawongithub/minitest-rails-shoulda.git'
gem 'capybara_minitest_spec', :group => :test
# mocking
gem 'mocha', :group => :test
# http testing
gem 'vcr', :group => :test
gem 'webmock', :group => :test
# factories
gem 'factory_girl_rails'
最佳答案
看起来 Spork 和 Minitest 实际上没有按预期工作。为了解决这个问题,必须进行以下更改:
Guardfile 内部,:drb => true
必须添加到 minitest:
guard 'minitest', :drb => true do
#...
end
然而,仅此一项就会打破守卫/minitest/spork,因为它试图强行喂它
-r -e
当前不支持的选项。你会遇到以下错误:Running: test/models/business_test.rb
Running tests with args ["-r", "/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/guard-minitest-0.5.0/lib/guard/minitest/runners/default_runner.rb", "-e", "::GUARD_NOTIFY=true", "test/test_helper.rb", "./test/models/business_test.rb"]...
Exception encountered: #<LoadError: cannot load such file -- -r>
backtrace:
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:251:in `require'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:251:in `block in require'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:236:in `load_dependency'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/activesupport-3.2.8/lib/active_support/dependencies.rb:251:in `require'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/spork-minitest-0.0.3/lib/spork/test_framework/minitest.rb:13:in `block in run_tests'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/spork-minitest-0.0.3/lib/spork/test_framework/minitest.rb:12:in `each'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/spork-minitest-0.0.3/lib/spork/test_framework/minitest.rb:12:in `run_tests'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/spork-0.9.2/lib/spork/run_strategy/forking.rb:13:in `block in run'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/spork-0.9.2/lib/spork/forker.rb:21:in `block in initialize'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/spork-0.9.2/lib/spork/forker.rb:18:in `fork'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/spork-0.9.2/lib/spork/forker.rb:18:in `initialize'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/spork-0.9.2/lib/spork/run_strategy/forking.rb:9:in `new'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/spork-0.9.2/lib/spork/run_strategy/forking.rb:9:in `run'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/spork-0.9.2/lib/spork/server.rb:48:in `run'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/1.9.1/drb/drb.rb:1548:in `perform_without_block'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/1.9.1/drb/drb.rb:1508:in `perform'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/1.9.1/drb/drb.rb:1586:in `block (2 levels) in main_loop'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/1.9.1/drb/drb.rb:1582:in `loop'
/Users/chance/.rbenv/versions/1.9.3-p125/lib/ruby/1.9.1/drb/drb.rb:1582:in `block in main_loop'
Done.
幸好有pull request for spork-minitest that fixes it .
一旦 gem 指向 repo,它就可以很好地减少加载时间。它没有 node.js 和 mocha 快,但至少比 rspec 快。
关于ruby-on-rails-3 - 使用 Minitest+Guard+Spork,每次运行都会重新加载所有测试套件和支持文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13166238/