RSpecのCapybaraによるフィーチャーテストのclick_linkを使ったテストが通らなかった

途中にリダイレクト処理がある認証ページのフィーチャーテストを書いていましたが、ずっとハマりっぱなしで。 半ばギブアップ状態になったんですが、解決方法が分かったのでメモ。

要因

リダイレクトを待たずにexpect.toが走っていた

コード

expect { click_link 'Sign in'; }.to change(User, :count).by(1)

解決法

ruby - Rspecのフィーチャーテストが失敗したりしなかったり - スタック・オーバーフロー
http://ja.stackoverflow.com/questions/463/rspec%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%81%E3%83%A3%E3%83%BC%E3%83%86%E3%82%B9%E3%83%88%E3%81%8C%E5%A4%B1%E6%95%97%E3%81%97%E3%81%9F%E3%82%8A%E3%81%97%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%8A

次のようにリダイレクトの処理が終わるぐらいまでsleepさせて待つようにします。

expect { click_link 'Sign in'; sleep 3; }.to change(User, :count).by(1)

js: trueのついたテストはjsの処理が終わる前にRSpecが先に進んでしまい、本来通るはずのテストがfailすることがあるそうです。

はぁ〜これで休日全部持ってかれました。
でもなんとかなって良かった。
もっと頑張ります。

追記: wait_for_ajaxってのもあるっぽいのでajax処理の場合はこちらも使ってみると良さそうです。