これはすべて Rails 2.3.5 では問題なく動作しましたが、請負業者が 2.3.14 に直接アップグレードすると、突然すべての統合テストで次のように言われました。
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.[]
一部の JavaScript が使用する Cookie の束を設定する ApplicationController に before_filter があり、Cookie の値を設定する行の 1 つを除いてすべてコメントアウトすると、正常に動作し、どの行でも問題ないことがわかりました。私は去ります。
before_filter :set_cookies
def set_cookies
cookies['logged_in'] = (logged_in ? 'y' : 'n')
cookies['gets_premium'] = (gets_premium ? 'y' : 'n')
cookies['is_admin'] = (is_admin ? 'y' : 'n')
end
これらの行の 1 つだけがアクティブな場合、統合テストではすべて問題ありませんが、それ以外の場合は上記のエラーが発生します。たとえば、次のテスト/レスポンスを考えてみましょう:
test "foo" do
get '/'
end
$ ruby -I"lib:test" test/integration/foo_test.rb -n test_foo -v
Loaded suite test/integration/foo_test
Started
test_foo(FooTest): E
Finished in 5.112648 seconds.
1) Error:
test_foo(FooTest):
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.[]
test/integration/foo_test.rb:269:in `test_foo'
1 tests, 0 assertions, 0 failures, 1 errors
しかし、これらの Cookie 設定行のいずれか 2 つがコメント アウトされている場合は、次のようになります。
$ ruby -I"lib:test" test/integration/foo_test.rb -n test_foo -v
Loaded suite test/integration/foo_test
Started
test_foo(FooTest): .
Finished in 1.780388 seconds.
1 tests, 0 assertions, 0 failures, 0 errors
開発モードと本番モードで実行されている Web サイトは正常に動作します。これは、テストに合格するだけの問題です。また、デバッグ出力を使用して、Cookie が設定されたメソッドでエラーがスローされないこと、すべてが正常に実行されること、エラーが発生するのは後でどこかであることを確認しました (ただし、バックトレースでは場所がわかりません)。