ソリューション: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プロジェクトが作成されるので、これで良いと思う。