Rspec 为什么Timecop.freeze只在我运行完整的规范套件时才起作用?

Rspec 为什么Timecop.freeze只在我运行完整的规范套件时才起作用?,rspec,rake,bundler,timecop,Rspec,Rake,Bundler,Timecop,我有一个大型rails测试套件,我只使用了一次Timecop it "should not include votes from today" do assert_equal 8, @answer.todays_score end it "should include today's votes tomorrow" do Timecop.travel(Date.today + 1) do assert_equal 10, @answer.yesterdays_score e

我有一个大型rails测试套件,我只使用了一次Timecop

it "should not include votes from today" do
  assert_equal 8, @answer.todays_score
end

it "should include today's votes tomorrow" do
  Timecop.travel(Date.today + 1) do
    assert_equal 10, @answer.yesterdays_score
  end
end
这些规格在我运行完整套件时通过:

rake

但是,如果我尝试运行一个较小的集合或单个规范,Timecop.freeze将不起作用。也就是说,以下两项都将失败:

rspec ./spec/models/answers_spec.rb

rake spec:models
有什么想法吗?我是否遗漏了ruby/rspec/rake和bundler之间的交互?。(对于记录——当我运行前面带有“bundle execute”的所有操作时,我得到了相同的结果)

我将包括我的Gemfile和spec.helper,以防澄清任何问题

档案:

gem 'rails', '3.2.8'
gem 'omniauth'
gem 'omniauth-twitter'
gem 'omniauth-facebook'
gem 'haml-rails'
gem 'sass'
gem 'chronic'
gem 'chronic_duration'
gem 'heroku'
gem 'pg', '0.13.1'
gem 'jquery-rails'
gem 'jquery_mobile_rails', "1.1.0"
gem "bcrypt-ruby", :require => "bcrypt"
gem 'rails_autolink'

group :assets do
  gem 'sass-rails'
  gem 'coffee-rails'
  gem 'uglifier'
end

group :development, :test do
  gem 'timecop'
  gem 'ruby-prof' 
  gem 'factory_girl_rails'
  gem 'rspec-rails'  
  gem 'capybara'
  gem 'mocha'
end
spec_helper.rb:

require 'rubygems'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'capybara/rails'
require 'rspec/autorun'
require 'mocha'

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

RSpec.configure do |config|
  config.mock_with :mocha
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.include(MailerMacros)  
  config.before(:each) { reset_email }
end

我相信,如果您尝试运行
rake spec
足够多的时间,就会有失败的时候。当测试之间的时间间隔变小时(只是一种预感),可能会有一个时间依赖性问题在某处加剧

我的猜测是,
@answer
有一个时间字段,它在Timecop块中调用之前已经实例化。我认为您必须在另一个Timecop.freeze块中创建
@answer
,这样就不会对
@answer
的时间来源进行二次猜测

在块之前检查您的
。(any
before:all
块?)。如果之前有一个
:以前测试中的所有
内容也可能导致更改

require 'rubygems'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'capybara/rails'
require 'rspec/autorun'
require 'mocha'

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

RSpec.configure do |config|
  config.mock_with :mocha
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.include(MailerMacros)  
  config.before(:each) { reset_email }
end