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 を返すようにしています。

よかったよかった。

コメントを残す