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処理の場合はこちらも使ってみると良さそうです。