LoginSignup
2
3

More than 5 years have passed since last update.

Railsアンチパターン<テスト編>③rake taskや④gemのテスト

Posted at

ソリューション:rakeタスクをアプリケーションコードにできないか考える

RakeTaskのテストはアプリーションコードをテストするようにはいかない。rubyコード内でシェルを叩いて実行することはできるが、

  • forkするプロセスのテストはむずいし、時間がかかる
  • 関連するfileのテスト中の扱いとかめんどくさい
  • 同じプロセスでないのでmockすらもできない
  • DBのコネクションも貼り直しなのでtransactionとか意味なくなる

という問題がある。一応、やり方はある程度確立されているみたいだけど。

解決法は今貼ったリンクの最初にも書いてるけど、クラス(メソッド)に切り出してアプリケーションコードにしてしまうこと。
これで、テストに特別なことが必要なくなる。

さて次はgemのテスト。
gemには特にテストを書くべきだ。それは動作説明書にもなるし、ちゃんとテストされてないgemはあんまり誰も使おうと思ってくれない。
しかしながらgemとRailsの結合度によってテスト難度は変わってくる。

ソリューション1: rails関係ないテストを書く

railsの機能を使用していないgemならこれでよい。Railsプロジェクトで使用されてるからと言ってRailsをテストで読み込む必要があるかは別の話なのでよく考えてみよう。

ソリューション2: railsの一部を読み込む

railsは幾つかのgemの集まりなので、あなたのgemがどの部分に依存しているかよく考えよう。active_recordしか使っていないのなら何もrails全部を読み込む必要はない。active_recordだけをrequireすればよい。

ソリューション3: テスト用の小さいrailsアプリケーションを丸ごと入れてしまう

これの実現方法が本意は詳しく解説されてるんだけど、現在はpluginを作成するコマンド(@bin/rails plugin new)を叩くと内部にdummy railsプロジェクトが作成されるので、これで良いと思う。

結論:rakeタスクはなるべくアプリケーションコードに含めよう。rails plugingemのテストはデフォルトで作成されるdummy railsプロジェクトで行おう。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3