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 }