我有一个大型导轨测试套件,我只使用一次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和bundler之间的交互的东西吗? (对于记录 - 当我运行以上所有上面的'捆绑执行')时,我得到相同的结果。
我包括我的Gemfile和spec.helper,以防任何事情澄清。
的Gemfile:
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
答案 0 :(得分:1)
我相信如果您尝试运行rake spec
足够多次,有时会失败。当测试之间的时间间隔较小(只是预感)时,某处可能存在时间依赖性问题。
我的猜测是@answer
有一个时间字段,它在Timecop块中被调用之前已被实例化。我认为您必须在另一个Timecop.freeze块中创建@answer
,以便不会对@answer
的时间来源进行二次猜测。
检查before
块。 (任何before :all
块?)我认为在before
块中运行较小的测试套件命令会导致在Timecop启动之前使用不需要的时间戳实例化对象。如果有{{1}来自先前测试的东西也可能导致了变化。