2013-05-15 54 views
12

我在我的控制器中使用了strong_parameters gem,但我很難理解如何測試它。RSpec - 測試強大的參數

這是我想測試user_params方法,以確保它是正確過濾掉惡意的鍵/值對我的設置

class UserController < ActionController::Base 
    include ActiveModel::ForbiddenAttributesProtection 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     ... 
    end 
    end 

    private 
    def user_params 
    params.require(:user).permit(:first_name, :last_name, :username, :email) 
    end 
end 

的例子,但無法弄清楚如何做到這一點。有沒有其他人通過這個?

回答

14

您可以存根params哈希表作爲

params = ActionController::Parameters.new(your_hash) 

這是你的網址參數被轉換到你的控制器類,和它給你的需要和允許的方法。

我個人將功能提取出來放到一個新的類中來處理授權策略。

0

我不確定我會測試strong_parameters,我猜你正在使用the gem

該寶石有its own tests,所以我們可以假設它按預期工作。

這是'testing Rails'的例子,我認爲這是不必要的。我不會測試attr_accessible作爲廣告(測試Rails),或attr_accessor(測試Ruby)。

恕我直言,您的集成測試應涵蓋所有所需的成功/失敗情況,並隱含涵蓋您的strong_parameter配置。

+3

我們的測試的政策是明確寫入測試所有的功能,讓我們有可能切換寶石/稍後再滾動我們自己,並且仍然知道系統正在工作。 – Bryce

+10

您也可以測試與strong_parameters集成的代碼是否正常工作。我有根據用戶角色/權限可寫/不可寫的字段,所以我需要測試這兩個部分是否正確集成。 – cpuguy83

+1

從Rails 1.1到3.2(現在準備4.0)的應用程序,我可以向你保證,測試Rails是非常必要的。在一個版本的Rails中單向工作的東西可能會改變另一個版本的行爲。例如,我曾經使用clone方法克隆activerecord記錄,但是在3.0到3.2之間,他們認爲'dup'會提供該功能,而不是稍微不同。這個廣告並不是很好,但很快就被我的測試所吸引。 – sockmonk

5

根據您的需要修改此,

describe "create action" do 
    it 'creates a user' do 
     User.should_receive(:create). 
     with({name: 'Alan D'}.with_indifferent_access) 
     post :create, user: 
     { first_name: 'Alan', last_name: 'Donald', username: 'alan77', email: '[email protected]' } 
    end 
end 

或其他替代解決這個問題是:

describe UsersController::UserParams do 
    it 'cleans the params' do 
    params = ActionController::Parameters.new(user: {foo: 'bar', name: 'baz'}) 
    user_params = UsersController::UserParams.build(params) 
    expect(user_params).to eq({name: 'baz'}.with_indifferent_access) 
    end 
end