Spork:如何刷新验证和其他代码?

ege*_*ari 19 validation rspec ruby-on-rails spork

我整天都在使用spork,大部分时间它都非常棒.

但是,我经常遇到一些问题,我需要重新启动Spork以便我的测试通过......现在我想知道它是否比它的价值更麻烦.我是ruby的新手,所以有时我无法预测错误是由于刷新问题,还是因为我不熟悉Ruby和Rails而导致错误.

我需要将什么内容放入Spork.each_run块中,以便我的验证和其他内容被刷新,这样我就不必重新启动spork服务器了?

谢谢

Ern*_*est 15

编辑:如果你可以升级到Ruby 2.0,这是你最好的选择.它足够快,可以让你以常规方式工作,而不需要像Spork,Zeus等工具.从本质上讲,你不需要我在下面写的任何东西.

如果您在开发时仍需要一些减速带,请查看快速路径命令.


好吧,如果您更改了环境,初始化程序或spec_helper文件(并且保护spork是完美的),您想要重新加载Spork,但是当您更新其中一个类(模型)时则不会,因为这会否定spork等工具的用途.我有同样的问题:我可以删除模型中的所有方法,测试仍然会通过,因为Spork在内存中保存"旧"模型类.需要重新启动Spork.

原因:

一些插件会导致模型代码被预加载,因此需要一些工作来阻止模型代码的发生.

您希望阻止预加载的模型代码,因为如果您进行任何更改(例如验证),这将不会"重新加载"它们.

解决方案:

取决于所涉及的宝石.在我的情况下,我不得不处理Devise和FactoryGirl,但实际上,你是通过使用Wiki上描述的Spork.trap_method来实现的:https://github.com/sporkrb/spork/wiki/Spork.trap_method-Jujitsu

此外,您可以运行spork -d以获取预加载的文件列表,可能有助于跟踪导致此问题的宝石.

示例:Rails 3.0.x + Rspec2 + Spork 0.9.0.rcX + Capybara + Devise + FactoryGirl

# spec/spec_helper.rb
Spork.prefork do
  # This file is copied to spec/ when you run 'rails generate rspec:install'
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'capybara/rspec'
  require 'capybara/rails'

  # set "gem 'factory_girl', :require => false" in Gemfile
  require 'factory_girl'

  # deal with Devise
  require "rails/application"
  Spork.trap_method(Rails::Application, :reload_routes!)

  require File.dirname(__FILE__) + "/../config/environment.rb"

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    config.mock_with :rspec
    config.use_transactional_fixtures = false
    config.before(:suite) do
      DatabaseCleaner.strategy = :transaction
    end
    config.before(:each) do
      DatabaseCleaner.start
    end
    config.after(:each) do
      DatabaseCleaner.clean
    end

    # Devise controller test helpers:
    config.include Devise::TestHelpers, :type => :controller
  end
end

Spork.each_run do
  # deal with factory girl
  Factory.definition_file_paths = [File.join(Rails.root, 'spec', 'factories')]
  Factory.find_definitions
end
Run Code Online (Sandbox Code Playgroud)

请注意,config.cache_classes = true需要true在测试环境中设置,否则您可能会收到来自FactoryGirl等宝石的错误.

这使我的模型测试(规范)快速运行,并在每次保存文件并激活rspec时"重新加载"它们.

编辑:如果您在Ruby 1.9.3上运行,您可以尝试一个有趣的替代方案:Zeus - https://github.com/burke/zeus


Jes*_*ott 14

更新类时使用Guard重新加载Spork Guard :: Spork允许自动智能地启动/重新加载RSpec/Cucumber Spork服务器.

  1. https://github.com/guard/guard-spork
  2. http://flux88.com/2011/04/using-guard-spork-with-mongoid-devise/