satococoa's blog

主にサーバーサイド、Web 系エンジニアのブログです。Go, Ruby, React, GCP, ...etc.

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

問題

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

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

やってみたこと

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

warden_test

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

解決

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

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

まとめ

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