【问题标题】:Why does Timecop.freeze only work when I run my full spec suite?为什么 Timecop.freeze 仅在我运行完整的规格套件时才有效?
【发布时间】:2012-09-02 16:26:43
【问题描述】:

我有一个大型 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

rake spec

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

rspec ./spec/models/answers_spec.rb

rake spec:models

有什么想法吗?我是否错过了关于 ruby​​ / rspec / rake 和捆绑器之间的交互的一些东西? (作为记录——当我运行上述所有以“捆绑执行”开头的内容时,我得到了相同的结果)。

我将我的 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

【问题讨论】:

    标签: rspec rake bundler timecop


    【解决方案1】:

    我相信,如果您尝试运行rake spec 的次数足够多,那么它有时会失败。当测试之间的时间间隔较小时(只是预感),某处可能存在时间依赖性问题。

    我的猜测是@answer 有一个时间字段,该字段在 Timecop 块中被调用之前已被实例化。我认为您必须在另一个 Timecop.freeze 块中创建@answer,这样就不会再猜测@answer 的时间起源了。

    检查您的 before 块。 (任何before :all 块?)我认为当在before 块中运行较小的测试套件命令时,会导致在Timecop 启动之前使用不需要的时间戳实例化对象。如果有来自先前测试的before :all 东西可能也引起了变化。

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2020-09-04
      • 1970-01-01
      • 2022-01-27
      相关资源
      最近更新 更多