簡體   English   中英

Rails and devise-登錄和注銷后的測試控制器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM