Rails本体の、testを実行する(4)

一昨日 (http://d.hatena.ne.jp/kouji0625/20130613/p1) の続きです。
一昨日の時点で、あとは activerecord の失敗するテストをどうにかすればOKという状態でした。さぁ、今日もはりきっていってみよ〜♪

activerecord

テストに失敗する

activerecord のテストは同じ内容のテストを MySQL, MySQL2, SQLite, PostgreSQL に対して行うため、エラーの数は多いですが、修正箇所は(エラーの数よりも)少ないです。
まずは「Using native MySQL」において、失敗するテストをなんとかします。

  1) Failure:
test_reordered_scope_overrides_default_scope_order(DefaultScopingTest)
    [./test/cases/relation_scoping_test.rb:421:in `test_reordered_scope_overrides_default_scope_order'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<false> is not true.

これは「scope :reordered_by_name, reorder('name')」を「scope :reordered_by_name, except(:order).order(:name)」に変えたことが原因だと分かりました。
reorderは3.0.7からdeprecatedではなくなっているので、reorderに戻すことにした。(reverted 6f3a4c6b5e38acec11887b1adbc6e0bbf75dce1b)

  2) Failure:
test_should_automatically_build_new_associated_models_for_each_entry_in_a_hash_where_the_id_is_missing(TestNestedAttributesOnAHasAndBelongsToManyAssociation)
    [./test/cases/nested_attributes_test.rb:608:in `test_should_automatically_build_new_associated_models_for_each_entry_in_a_hash_where_the_id_is_missing'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<"Grace OMalley"> expected but was
<"Privateers Greed">.

  3) Failure:
test_should_automatically_build_new_associated_models_for_each_entry_in_a_hash_where_the_id_is_missing(TestNestedAttributesOnAHasManyAssociation)
    [./test/cases/nested_attributes_test.rb:608:in `test_should_automatically_build_new_associated_models_for_each_entry_in_a_hash_where_the_id_is_missing'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<"Grace OMalley"> expected but was
<"Privateers Greed">.

この2つはv3.0.20の修正を手作業で取り込むことで対応。(commit: cf2769c3284d04180646dc296e5823d8f53263ea)

修正した結果、「Using native MySQL2」「Using native SQLite3」でも全てのテストが成功するようになりました。(やったね!!)

最後は「Using native PostgreSQL」。これは強敵です。

  1) Failure:
test_should_be_able_to_encode_relation(DatabaseConnectedJsonEncodingTest)
    [./test/cases/json_serialization_test.rb:216:in `test_should_be_able_to_encode_relation'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<"[{\"author\":{\"name\":\"David\"}},{\"author\":{\"name\":\"Mary\"}}]"> expected but was
<"[{\"author\":{\"name\":\"Mary\"}},{\"author\":{\"name\":\"David\"}}]">.

v3.0.20をバックポートして対応。

$ git diff v3.0.3..v3.0.20 test/cases/json_serialization_test.rb | patch -p2
  2) Failure:
test_delete_all_association_with_primary_key_deletes_correct_records(HasManyAssociationsTest)
    [./test/cases/associations/has_many_associations_test.rb:739:in `test_delete_all_association_with_primary_key_deletes_correct_records'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<1> expected but was
<2>.

  3) Failure:
test_depends_and_nullify(HasManyAssociationsTest)
    [./test/cases/associations/has_many_associations_test.rb:903:in `test_depends_and_nullify'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:67:in `run'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
     /Users/kouji/work/rails/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:65:in `run']:
<#<Account id: 3, firm_id: 6, firm_name: nil, credit_limit: 50>> expected but was
<#<Account id: 5, firm_id: 6, firm_name: nil, credit_limit: 55>>.

v3.0.20との差分を見ながら手作業で修正。(commit: 90f234e)

その後

全て対応できたと思ったら、失敗するテストがでてきた。
ちょっと雑になってしまうけど(笑)、以下のコミットで修正。

  • 9ecad8ac3ade2c41fdd5115fdc4990ab5104697e
  • 479b5017f76bb8ddbe23d6e243c6ad14d6321666
  • debb4fc034f5414587d094eb9af615b07bee338c
  • ff25db0c87aaa4fbe6ef609cf7e2e70b71ce779c
  • 83ea5959bad138564c7fe0a45ee89805f8861ee2
  • 810dd5788f0ef9be84f24d43452c5832e05393f0
  • 28c1f6731369180c73bf2ca837b1c21efae78047

これでテストが通るクリーンな Rails 3.0.3 が用意出来ました。
興味がある方は takaokouji/railsGitHub: https://github.com/takaokouji/rails/tree/takaokouji/v3.0.3 からどうぞ。

残りの作業は TravisCI を設定して、コミットのたびに test を実行できるようにすることです。

(つづく...)

--- 参考URL

--- PR広告
記事を読んでくださり、ありがとうございます。もしよろしければ、この記事の著者が提供している無料のサービス「かくってる?」をお試しください。