Rails 4.2 で rails-api を使った controller のテスト(by MiniTest)で認証をどうしよう?
おそらく rails-api の generator が自動で生成したものだと思うのだが、昔に作ったプロジェクトである程度テストがあったので、とりあえず rake してみた。
すると、401 で失敗する。ApplicationController で アクセストークンをチェックしているためである。どう対応すればよいか調べてみた。
RSpec を使っているなら、認証チェックしているメソッドを stub する方法が楽そう。
https://stackoverflow.com/a/12764619
ただ、残念ながら Rails 標準のテスト(MiniTest)で書かれている。
test_helper とかでログイン処理を書けばよいのかと思ったが、ActionController::UrlGenerationError: No route matches のエラーが出る。どうも他のコントローラのメソッドは呼び出せない様子。
複数のコントローラを使うテストは IntegrationTest として書く必要があるらしいが、そこまでは大層な気が…。
と思ったら、MiniTest でも stub する方法がありました!
具体的には下記のようにすればいけました。
require 'minitest/autorun'
class UsersControllerTest < ActionController::TestCase
test "should show user" do
@controller.stub(:restrict_access, true) do
get :show, id: 1
end
assert_response :success
end
end
require を追加し、@controller.stub でメソッド名、戻り値を引数に渡すと、ブロック内だけメソッドの挙動を上書きできます。restrict_access というのがアクセストークンをチェックしているメソッドです。これをテストの時は毎回 true を返すようにしています。
よかったよかった。
コメントを残す