2012-09-02 3 views
0

난 대형 레일 테스트 스위트를 가지고 있고, 한 번만 Timecop을 사용하고 있습니다. 내가 가진 전체 제품군을 실행할 때Timecop.freeze가 full spec suite를 실행할 때만 작동하는 이유는 무엇입니까?

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 

아이디어가 있으십니까? 루비/rspec/레이크와 아마도 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 

답변

1

난 당신이 rake spec 충분한 시간을 실행하려고하면이 실패 할 때 시간이 될 것이라고 생각합니다. 아마도 시간 의존성 문제가있을 수 있습니다. 어딘가에 테스트 간의 시간차가 작을 때 (가끔씩) 직감이 심합니다.

내 생각에 @answer에는 Timecop 블록에서 호출되기 전에 인스턴스화 된 시간 필드가 있습니다. @answer 님의 시간대에 대한 추측이 없도록 다른 Timecop.freeze 블록 내에 @answer을 만들어야한다고 생각합니다.

before 블록을 검사하십시오. (어떤 before :all 블록?) 나는 작은 테스트 스위트를 실행할 때 before 블록에서 명령을 실행하면 Timecop이 실행되기 전에 원하지 않는 타임 스탬프로 인스턴스화 된 개체가 생성된다고 생각합니다. 이전 테스트의 내용이 변경된 경우도 있습니다.