iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
自我挑戰組

Rails測試寫起乃!!!系列 第 15

Day15 測試寫起乃 - Devise login user

在開始寫測試的時候因為許多 action 進入前都必須要先登入使用者才能有權限做其他事情,但在測試該如何登入使用者呢? 其實在 Devise 有提供 sign_in 給測試做使用

login_user

rspec 如果不想要每次都一直sign_in @user 還有設定一些條件 其實可以做成一個 module 方便在測試的時候不用一直登入而且可以在裡面做其他更多的預設條件

如果想要有sign_in的方法使用需要先在spec_heloper加上

  config.include Devise::TestHelpers, type: :controller # controller spec才需要加
  config.include Devise::Test::IntegrationHelpers, type: :request # request spec才需要加

然後在/spec/support下新增ControllerMacros.rb

# ControllerMacros.rb

module ControllerMacros
  # possible roles: :user, :admin, :pos_user
  def login_user(role = nil, type: :each)
    before(type) do
      @user = create(role || :user)
    end

    before(:each) do
      @request.env['devise.mapping'] = Devise.mappings[:user]
      sign_in @user
    end
  end
end

最後再把這個檔案 extends 到spec_helper即可

config.extend ControllerMacros, type: :controller 
#request spec要改成type: :request

就能夠做到在 rspec 中登入 user 摟!

遇到的雷

再將controller改成request的時候發現
Devise::TestHelpers, type: :controller不能只把type改成request 可能會出現錯誤 undefined method env for nilnilclass

在 rpsec relish寫到

Request specs are RSpec wrappers for Rails integration tests.

才知道request spec可能被歸類為 integration test 所以要include的helper應該是Devise::Test::IntegrationHelpers, type: :request

只要增加這行就沒問題了!


上一篇
Day14 測試寫起乃-request vs controller test
下一篇
Day16 測試寫起乃 - 測試覆蓋率
系列文
Rails測試寫起乃!!!30

尚未有邦友留言

立即登入留言