2013-05-15 38 views
12

Tôi đang sử dụng đá quý strong_parameters trong bộ điều khiển của mình, nhưng tôi đang gặp khó khăn trong việc hiểu cách thử nghiệm.RSpec - Kiểm tra thông số mạnh

Dưới đây là một ví dụ về thiết lập của tôi

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 

Tôi muốn thử nghiệm các user_params phương pháp để đảm bảo rằng nó được lọc một cách chính xác ra cặp khóa/giá trị độc hại, nhưng không thể tìm ra cách để làm điều đó. Có một ai đã từng đi qua cái này?

Trả lời

14

Bạn có thể còn sơ khai băm params như

params = ActionController::Parameters.new(your_hash) 

Đây là lớp học mà params URL của bạn đang được chuyển đổi sang trong điều khiển của bạn, và nó mang lại cho bạn những phương pháp đòi hỏi và cho phép.

Cá nhân tôi trích xuất chức năng ra thành lớp mới để xử lý chính sách ủy quyền.

0

Tôi không chắc mình sẽ kiểm tra strong_parameters, mà tôi đoán bạn đang sử dụng qua the gem.

Đá quý có its own tests, vì vậy chúng tôi có thể giả sử nó hoạt động như mong đợi.

Đây là ví dụ về 'Rails thử nghiệm', điều tôi tin là không cần thiết. Tôi sẽ không kiểm tra rằng attr_accessible hoạt động như được quảng cáo (Kiểm tra đường ray) hoặc attr_accessor (Kiểm tra Ruby).

IMHO, kiểm tra tích hợp của bạn phải bao gồm tất cả các trường hợp thành công/lỗi mong muốn và ẩn hoàn toàn cấu hình strong_parameter của bạn.

+3

chính sách kiểm tra của chúng tôi là viết một cách rõ ràng các xét nghiệm cho tất cả các chức năng, cho phép chúng ta có khả năng chuyển đổi đá quý/cuộn của chúng tôi sau này và vẫn biết rằng hệ thống đang hoạt động. – Bryce

+10

Bạn cũng có thể thử nghiệm mã của mình tích hợp với strong_parameters đang hoạt động bình thường. Tôi có các trường có thể ghi/không ghi được tùy thuộc vào vai trò/quyền của người dùng, vì vậy tôi cần kiểm tra xem hai phần này có tích hợp đúng không. – cpuguy83

+1

Có một ứng dụng từ Rails 1.1 đến 3.2 (và bây giờ chuẩn bị cho 4.0), tôi có thể đảm bảo với bạn rằng việc kiểm tra Rails là rất cần thiết. Một cái gì đó mà làm việc một cách trong một phiên bản của Rails có thể thay đổi hành vi trong một phiên bản khác. Ví dụ, tôi đã sử dụng để nhân bản các bản ghi activerecord bằng cách sử dụng phương thức 'clone', nhưng ở đâu đó giữa 3.0 và 3.2 họ quyết định rằng' dup' sẽ cung cấp chức năng đó thay thế ... và làm nó hơi khác. Điều này đã không được quảng cáo tốt, nhưng nó đã nhanh chóng bị bắt bởi các xét nghiệm của tôi. – sockmonk

5

Sửa đổi này theo nhu cầu của bạn,

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 

hoặc giải pháp thay thế khác cho vấn đề này là:

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 
Các vấn đề liên quan