SinatraでWardenを使った認証がテストできなかった件
問題
wardenを使ってsinatraアプリを作っていたのですが、テスト時にwardenのauthenticated?
などのメソッドを呼び出す箇所でenv['warden']がnilになっている旨の例外が発生し、うまくテストできませんでした。
これはcapybara-webkitやseleniumドライバを使っても同様でした。
しかし、ブラウザからアクセスするとちゃんとwardenが有効になり、意図通り認証ができます。
やってみたこと
wardenやrack/testのコードを読んだりしてみたのですが、どうにも理由がわかりませんでした。
deviseのTestHelperも見たのですが、今回の件にはあまり大きく関係しないのかなぁという感じで。
埒が明かないので、この件をエントリにまとめて有識者に助けてもらうことを期待し、検証するための小さなアプリを作ってみました。
app.rbに、ほとんどのコードを積み込みました。
なんと、こちらのコードでは正しくテストができました。Caypbaraでcapybara-webkitやseleniumドライバを使った時も同様にちゃんと動きました。
解決
わかってみれば単純でした。以下のコードをrackup.ruに書いていたのがいけないのでした。テスト時にwardenがそもそも使われていなかったということですね。
use Warden::Manager do |manager|
manager.default_strategies :password
manager.failure_app = Hogehoge::App
end
まとめ
問題の切り分けのためにはちょっと面倒でも手を動かして検証しましょう。