223 Software

主に勉強したことなどを記録するログです。 最近はRuby, Railsなどが多め。

test - 223 Software

SinatraでWardenを使った認証がテストできなかった件

問題

wardenを使ってsinatraアプリを作っていたのですが、テスト時にwardenのauthenticated?などのメソッドを呼び出す箇所でenv['warden']がnilになっている旨の例外が発生し、うまくテストできませんでした。
これはcapybara-webkitやseleniumドライバを使っても同様でした。

しかし、ブラウザからアクセスするとちゃんとwardenが有効になり、意図通り認証ができます。

やってみたこと

wardenやrack/testのコードを読んだりしてみたのですが、どうにも理由がわかりませんでした。
deviseのTestHelperも見たのですが、今回の件にはあまり大きく関係しないのかなぁという感じで。
埒が明かないので、この件をエントリにまとめて有識者に助けてもらうことを期待し、検証するための小さなアプリを作ってみました。

warden_test

app.rbに、ほとんどのコードを積み込みました。
なんと、こちらのコードでは正しくテストができました。Caypbaraでcapybara-webkitやseleniumドライバを使った時も同様にちゃんと動きました。

解決

わかってみれば単純でした。以下のコードをrackup.ruに書いていたのがいけないのでした。テスト時にwardenがそもそも使われていなかったということですね。

use Warden::Manager do |manager|
  manager.default_strategies :password
  manager.failure_app = Hogehoge::App
end

まとめ

問題の切り分けのためにはちょっと面倒でも手を動かして検証しましょう。