2016-01-12 302 views
4

我是新來的MiniTest。大多數測試很容易掌握,因爲它是Ruby代碼,並且還具有Rspec風格的可讀性。然而,我在認證方面遇到了麻煩。與任何應用程序一樣,大多數控制器都隱藏在某種身份驗證之後,最常見的是authenticate_user以確保用戶已登錄。MiniTest身份驗證

如何測試session - >用戶已登錄?我從頭開始不使用身份驗證。

我有這個作爲參考:https://github.com/chriskottom/minitest_cookbook_source/blob/master/minishop/test/support/session_helpers.rb

但不太清楚如何實現它。

讓我們用這個作爲一個例子控制器:

class ProductsController < ApplicationController 
    before_action :authenticate_user 

    def index 
    @products = Product.all 
    end 

    def show 
    @product = Product.find(params[:id]) 
    end 

end 

如何將我的測試一下這些基本情況?

test "it should GET products index" do 
    # insert code to check authenticate_user 
    get :index 
    assert_response :success 
end 

test "it should GET products show" do 
    # insert code to check authenticate_user 
    get :show 
    assert_response :success 
end 

#refactor so logged in only has to be defined once across controllers. 

回答

1

是否使用自定義的驗證方法? 如果是這樣,你可以根據需要通過會話變量作爲第三個參數去請求方法:

get(:show, {'id' => "12"}, {'user_id' => 5}) 

http://guides.rubyonrails.org/testing.html#functional-tests-for-your-controllers

否則,如果你使用任何身份驗證庫通常爲測試了一些輔助方法。

+0

對於索引頁怎麼樣? – miler350

+0

我不'看到任何區別'get(:index,{},{'user_id'=> 5})' – Oleg

2

你需要包括設計測試助手,然後你可以像控制器一樣使用設計助手。

即:

require 'test_helper' 

class ProtectedControllerTest < ActionController::TestCase 
    include Devise::TestHelpers 

    test "authenticated user should get index" do 
    sign_in users(:foo) 
    get :index 
    assert_response :success 
    end 

    test "not authenticated user should get redirect" do 
    get :index 
    assert_response :redirect 
    end 

end 

還檢查了這一點:
How To: Test controllers with Rails 3 and 4 (and RSpec)

+0

我不使用設計。對不起,忘了在我的文章中指定。 – miler350

+1

in rails 5它是'include Devise :: Test :: IntegrationHelpers' – thedanotto