概要
RailsのテストにRspecを導入してガリガリとテストを書いていたら、アップデート周りの処理でまあまあハマったので記録しておこうと思います。色々なサイトを調べたのですが少し古かったり直接使えなかったりでうまくいかなかったので。
なお、ここではomniauthを用いた認証のみをユーザ認証に使っている場合のみに当てはまると思っていただいても差し支えはないと思います。普通に認証する場合はfixtureを使った方が間違いなく見通しよくかけます。
(ある意味での)原因
最初はfixtureを用意してそれを元にやっているのですが、いつまでたってもうまくいきませんでした。原因はfixtureを使っていたところにあって、逐一ログイン処理を書いて〜とやるとうまくいきました。ちなみに、うまくいかなった理由はログインをTwitter経由でのみ実装しているからです。テスト環境では一々認証していたら日が暮れてしまうので、わざわざネット経由で認証したりせず無条件でパスできるようになっています。これは裏を返せばここのユーザーを識別する情報を全く使わずに認証しているわけなので、例えばfixtureを使ってあらかじめポストを作っておいても、そのポストに対応したユーザーでログインできないのでそういった部分のテストがうまくいかないのでした。
と思っているのですが、実際には違うよ!ということがあれば教えていただけると嬉しいです。
ハマったところ
(おそらく)スコープがよくわからないことになっている
まず、以下のようなコードはうまくいきません.
attrs = { content: 'aaa',
url: '',
tags: 'aaa,hogehoge' }
...
it ... do
attrs = { content: 'a' }
# contentがaaa -> a になってほしい!
page.driver.submit :patch, "/hoges/#{@hoge.id}", hoge: attrs
# => うまくいかない!
end
この原因はいまだによくわかっていないのですが、it ... end ブロックの中のattrsという変数名を他のものにするとうまく動きました。つまり、次のコードは正常に動作します。
attrs = { content: 'aaa',
url: '',
tags: 'aaa,hogehoge' }
...
it ... do
dict = { content: 'a' }
# contentがaaa -> a になってほしい!
page.driver.submit :patch, "/hoges/#{@hoge.id}", hoge: dict
# => うまくいかない!
end
リクエストの書き方がよくわからない
色々調べてみると、リクエストの書き方として色々な書き方が出てきます。が、残念ながらそのうちの多くは自分の場合はうまく動作しませんでした。結局うまく動いたのは上に書いているようにpage.drive.submit ~としたものでした。
所感
テストを書くの大変ですね。