Rails + Ludia でテストする場合にハマった点


Ludia の機能を利用するRailsアプリケーションをテストする際、テスト用のデータベースが作成される度に Ludia をインストールする必要があります。しかし、標準の Rails では(当然ですが)この操作が行われないため、Ludia を必要とするコードがテスト中に実行されると、そこでエラーが発生してしまいます。

この問題を解決するためには、db:test:purge タスクが createdb した後で、かつ実際にテストが始まる前にpqsenna2.sql をデータベースに読み込む必要があります。

試行錯誤の結果、以下のようなコードを lib/tasks/ludia.rake に追加することで解決できました。

namespace :db do
  namespace :test do
    namespace :ludia do
      task :install => :environment do
        dbname = ActiveRecord::Base.configurations["test"]["database"]
        sh "psql -f `pg_config --sharedir`/pgsenna2.sql #{dbname}"
      end
    end
    task :clone => %w(test:ludia:install)
    task :clone_structure => %w(test:ludia:install)
  end
end

(以下、11/29 18:30頃追記しました。コメントありがとうございました。)

psql -f `pg_config --sharedir`/pgsenna2.sql template1

として template1 データベースにインストールしておくと、上記のような細工をしなくても createdb したときにこれがコピーされるそうです。状況にもよりますが、多くの場合(今後作成するdbにludiaがインストールされて問題が無いのであれば)、こちらのほうが良さそうですね。