0

私は大きな 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 とおそらく 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
4

1 に答える 1

1

rake spec十分な回数走ろうとすると失敗することもあると思います。テスト間の時間差が小さい場合(単なる予感)に悪化する時間依存性の問題がどこかにある可能性があります。

私の推測では@answer、Timecopブロックで呼び出される前にインスタンス化された時間フィールドがあります。別のTimecop.freezeブロック内に作成して、の時間の起源@answerについて二度と推測しないようにする必要があると思います。@answer

beforeブロックを調べます。(before :allブロックはありますか?)ブロック内で小さなテストスイートコマンドを実行するbeforeと、Timecopが起動する前に、オブジェクトが不要なタイムスタンプでインスタンス化されると思います。before :all以前のテストからのものがある場合は、変更も発生した可能性があります。

于 2012-09-11T06:06:58.503 に答える