くりにっき

フルスタックキュアエンジニアです

Rails Engineを単体でテストしてみる

Rails勉強会@東京 第86回 - Rails勉強会@東京 | Doorkeeper でしゃべった内容です

はじめに結論

子アプリが親アプリに依存しすぎているとテストするのはつらい

Jenkins用のスクリプト

元々は社内リポジトリに置いてたやつですが、需要がありそうだったのでマスキングして公開してみます 使いたい場合は適宜修正してください

スクリプトでやってること

  • Jenkins用のdatabase.ymlをコピー
  • 普通のアプリだと config/database.yml ですが、Rails engineのテストだと spec/dummy/config/database.yml が使われます
  • Rails Engineからは rake db:migrate はできないので子アプリ内に親アプリをcloneしてます
    • 構成
my_engine
└ tmp/
 └ parent_app
  • 親アプリでmigrationが更新されてることを考慮して rake db:migrate:reset
  • rake db:migrate:reset だと今度はEngineのmigrateが適用されなかったので*1、再度 rake db:migrate を実行
  • Engineアプリにcdしてようやく rspec を実行
    • 子アプリから親アプリのmodelを参照してる場合は適宜 spec/dummy/ にコピー*2

補足

Jenkinsのジョブ実行にシェルファイルを使えるのですが、シェルの中でエラーが起きてもそのままスクリプトが続行されてしまい、テストが失敗してもJenkins上は正常終了してしまうため*3、下記のようなラッパ経由でコマンドを実行してます

run()
{
  command=$1
  echo "$command"
 
  eval $command
 
  # if error code returned, exit this script with error code
  RET=$?
  if [ $RET -ne 0 ]; then
    exit $RET
  fi
}

*1:うちのアプリだけか?

*2:つらみある

*3:Jenkinsはシェルの終了ステータスを監視してる?