在開始寫測試的時候因為許多 action 進入前都必須要先登入使用者才能有權限做其他事情,但在測試該如何登入使用者呢? 其實在 Devise
有提供 sign_in
給測試做使用
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
只要增加這行就沒問題了!