[英]Rails / Devise: Gracefully ask user to sign in on signed-out create
[英]Rails and devise - testing controller when signed in and signed out
所以我想測試正在使用裝置的控制器。
require 'rails_helper'
describe ArticlesController do
before(:all) { @article = FactoryGirl.create(:article) }
sign_in_admin
describe 'GET new' do
let(:call_request) { get :new }
before { call_request }
context 'admin signed in' do
it { is_expected.to respond_with :ok }
end
context 'admin signed out' do
it { is_expected.to respond_with 302 }
end
end
end
我遵循來自devise Wiki的本指南 。 因此,我創建了ControllerMacros模塊,如下所示:
module ControllerMacros
def sign_in_admin
before(:each) do
@request.env['devise.mapping'] = Devise.mappings[:admin]
@admin = FactoryGirl.create(:admin)
sign_in @admin
end
end
end
並將其以及其他需要的東西包含到rails_helper中:
require_relative 'support/controller_macros.rb'
RSpec.configure do |config|
config.include Devise::TestHelpers, type: :controller
config.extend ControllerMacros, type: :controller
(...)
這是管理工廠:
FactoryGirl.define do
factory :admin do
email 'email@email.com'
password 'password'
end
end
但是現在我不知道如何退出管理員? 由於sign_in_admin在每次測試之前執行,但是我需要退出admin以進行某些測試。 用登錄/注銷管理員測試此控制器的最佳方法是什么?
順便說一句,我對測試有點陌生
Devise提供了一些幫助程序進行測試的方法,包括使用用戶的login_user,因此您無需創建sign_in_admin函數。 同樣,通過使用代碼塊頂部的before(:all),您也可以登錄管理員來獲取整套規范。
在要使用signed_in_admin的各個上下文中使用before(:each)。
describe ArticlesController do
describe 'GET new' do
let(:call_request) { get :new }
let(:admin_user) { FactoryGirl.create(:admin) }
before { call_request }
context 'admin signed in' do
sign_in(admin_user)
it { is_expected.to respond_with :ok }
end
context 'admin not signed in' do
it { is_expected.to respond_with 302 }
end
end
end
更好的方法是before
采取行動before
其關閉。 上下文是sign_in ,而不是in 。 因此,您可以執行以下操作:
describe 'GET new' do
let(:call_request) { get :new }
before { call_request }
context "signed in" do
before { sign_in_admin }
it { is_expected.to respond_with :ok }
end
context 'non-singed in' do
it { is_expected.to respond_with 302 }
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.