PostGIS の位置情報カラムを使った Rails アプリケーションのテストを実行する時、次のようなエラーを表示して失敗してしまう (Rails 3.1.1, PostgreSQL 9.1.1, PostGIS 1.5.3)。

$ bundle exec rake test:functional
rake aborted!
PGError: ERROR:  関数addgeometrycolumn(unknown, unknown, integer, unknown,
integer)は存在しません
LINE 1: ...d_at" timestamp, "updated_at" timestamp) ; SELECT AddGeometr...

この原因は test 用の DB を構築する際に PostGIS 関連の関数がロードされないかららしい。そこで、db/schema.rb から test 用 DB を構築するのではなく、development 用 DB のスキーマをダンプした SQL から構築するようにする。

SQL で test 用 DB を構築するには config/environments/test.rb を次のように修正する (コメントを読むと PostGIS に限らず DB 固有のカラム型を使う場合は SQL を使えと書いてある)。

$ vim config/environments/test.rb
   # Use SQL instead of Active Record's schema dumper when creating the test
database.
   # This is necessary if your schema can't be completely dumped by the schema
dumper,
   # like if you have constraints or database-specific column types
   # config.active_record.schema_format = :sql
   config.active_record.schema_format = :sql      (<= コメントを外す)

あとはテストを実行すれば OK。

$ bundle exec rake test:functionals RAILS_ENV=test

テスト実行中に development 用 DB のスキーマを複製した db/test_structure.sql が生成され、これをもとに test 用 DB が生成される。

追記 (2012/02/22)

db/test_structure.sql が生成されない場合は、

$ bundle exec rake db:test:clone_structure
$ mv development_structure.sql test_structure.sql
$ bundle exec rake test:functionals RAILS_ENV=test

とすれば大丈夫そう。