2014-06-18 21 views
10

Chiến lược thực tế để kiểm tra bộ lọc thông số mạnh trong bộ điều khiển Rails với Rspec là gì? (Ngoại trừ những người so khớp shoulda) Làm thế nào để viết kiểm tra thất bại và sau đó làm cho nó màu xanh lá cây?Làm cách nào để kiểm tra tham số mạnh mẽ với Rspec?

+0

Câu trả lời của tôi có giúp ích không? Có lẽ tôi có thể làm rõ điều gì đó. – zishe

+0

Cảm ơn bạn, bạn thực sự đã giúp tôi. Tôi không biết về with_indifferent_access. Và cách kiểm tra các yêu cầu thuộc tính, như params.require: user? – Molfar

Trả lời

9

Tạo 2 băm với các tham số được mong đợi và tất cả (không hài lòng). Sau đó, vượt qua tất cả các tham số để thực hiện và kiểm tra xem bạn có mô hình đối tượng chỉ nhận các tham số được mong đợi hay không. Nó sẽ không nếu bạn không sử dụng các bộ lọc tham số mạnh. Thêm quyền truy cập vào các thông số và kiểm tra lại kiểm tra.

Ví dụ này:

# action 
def create 
    User.create(params) 
end 

# spec 
it 'creates a user' do 
    expect_any_instance_of(User).to receive(:create). 
    with({name: 'Sideshow Bob'}.with_indifferent_access) 
    post :create, user: 
    { first_name: 'Sideshow', last_name: 'Bob', name: 'Sideshow Bob' } 
end 

sẽ vượt qua tất cả params cho người dùng và thử nghiệm sẽ thất bại. Và khi bạn lọc chúng:

def user_params 
    params.require(:user).permit(:name) 
end 

và thay đổi hành động với User.create(user_params), kiểm tra sẽ vượt qua.

+2

'create' là một phương thức mức lớp được định nghĩa trên' ActiveRecord :: Base' và được thừa hưởng bởi 'Người dùng'. Vì vậy, trong khi 'expect_any_instance (User)' (giả định giả định trên một thể hiện 'User') _might_ work,' expect (User) '(giả sử giả trên lớp' User') cũng sẽ hoạt động và tối thiểu. – dleve123

2

Sau đây là cách tôi đã làm nó:

describe 'Safe Params' do 

    let(:mixed_params) { 
    { 
     blueprint_application_environment: { 
     id: 1000, 
     blueprint_id: 1, 
     application_id: 2, 
     environment_id: 3 
     }, 
     format: :json 
    } 
    } 

context "when processing a Post request with a mix of permitted and unpermitted parameters" do 
    before { post :create, mixed_params } 

    it "a create will not set the value of the unpermitted parameter" do 
    expect(JSON.parse(response.body)["id"]).not_to eq(1000) 
    end 

    it "a create will set the value of the permitted parameters" do 
    expect(JSON.parse(response.body)["blueprint_id"]).to eq(1) 
    expect(JSON.parse(response.body)["application_id"]).to eq(2) 
    expect(JSON.parse(response.body)["environment_id"]).to eq(3) 
    end 
end 

cuối

đang điều khiển:

def create 
    @blueprint_application_environment = BlueprintApplicationEnvironment.new(blueprint_application_environment_params) 
    if @blueprint_application_environment.save 
     render 'show.json.jbuilder' 
    else 
     render json: @blueprint_application_environment.errors, status: :unprocessable_entity 
    end 
    end 

def blueprint_application_environment_params 
    params.require(:blueprint_application_environment).permit(:blueprint_id, :application_id, :environment_id) 
end 
7

Cá nhân tôi sử dụng shoulda-matcher từ thoughtbot.

Với một cái gì đó như:

it do 
    should permit(:first_name, :last_name, :email, :password). 
    for(:update, params: params) 
end 
1

như như bạn tạo hoặc cập nhật đối tượng sử dụng các thông số mạnh mẽ, nó cũng tương tự như ngoại trừ một điều mà bình thường bạn làm như thế này:

bài: tạo, book_id: @ book.id

Nhưng trong tham số mạnh bạn phải làm như thế này:

bài: tạo, {book_id: @ book.id, bình luận: {user_id: 101, book_id: @ book.id, mô tả: "đáng mua"}}

bạn có để truyền vào các tham số lồng nhau.

Các vấn đề liên quan