2012-02-26 1 views
2

rspec (v 2.6.1) post :create에서 전달 된 인수를 어떻게 조정합니까? 이 명령을 설명하는 rspec 문서를 가리키며이 명령을 사용하는 방법은 나에게 도움이 될 것입니다. 나는 보았지만 내 질문에 답하는 것을 찾을 수 없습니다.rspec POST에서 전달되는 해시 수정하기

고객을 위해 제대로 작동하려면 rspec을 작성하는 데 어려움이 있습니다. 고객 및 다른 사용자 개체 모두에 대해 매개 변수를받는 작업을 만듭니다. 좀 더 정확히 말하면, 나는 rspec 포스트에서 전달한 해시 값을 얻을 수 없다. 폼에서 생성 한 입력처럼 동작하도록 만든다.

내 Customer 및 User 객체는 별도의 ActiveRecord이며 각 Customer :는 사용자에게 속합니다. 여기

describe CustomersController do 

    render_views 

    describe "for signed-in admins" do 

    before(:each) do 
     @customer_attr = Factory.attributes_for(:customer) 
     @admin = Factory(:admin) 
     test_sign_in(@admin.user) 
    end 

    describe "POST 'create'" do 

     describe "success" do 

     it "should create a customer" do 
      lambda do 
      post :create, :customer => @customer_attr # The problem is here 
      end.should change(Customer, :count).by(1) 
     end 
     end 
    end 
    end 
end 

실패 것 :

이 여기가 원하는 일을 아니에요 내 RSpec에있어 분명히 (아래 살펴 보 겠지만)

1) CustomersController for signed-in admins POST 'create' success should create a customer 
    Failure/Error: lambda do 
    count should have been changed by 1, but was changed by 0 
    # ./spec/controllers/customers_controller_spec.rb:323:in `block (5 levels) in <top (required)>' 

문제가 post :create, :customer => @customer_attr 아무튼 ' t는 params[:user][:email]에 끝나는 인수를 포함하므로 params [: user]가 비어 있기 때문에 @ user.save가 실패하지만 해시를 다시 구성하고 해당 줄에 전달하는 모든 방법을 시도했지만 ' 그것을 작동시키지 마십시오.

여기에 관련 컨트롤러 코드입니다 :

def create 
    @user = User.new(params[:user]) 
    @user.user_type = 'customer' 

    @customer = Customer.new(params[:customer]) 

    if @user.save 
    @user.customer = @customer 
    if @customer.save 
     # create stuff 
     redirect_to customer_path, :flash => { :success => "Customer created." } 
    else 
     # failure stuff 
    end 
    else 
    # more failure stuff 
    end 
end 

여기에서 관련 양식 코드입니다 (나는 방법을 작동하는 그것에) :

<%= form_for(@customer) do |f| %> 

    <%= fields_for :user do |user_form| %> 
    <%= user_form.label :email %> 
    <%= user_form.text_field :email %> 
    <% end %> 

    <%= f.label :first_name %> 
    <%= f.text_field :first_name %> 
    <%= f.label :last_name %> 
    <%= f.text_field :last_name %> 

    <%= f.submit "Create Customer Account" %> 
<% end %> 

마지막으로, 여기 내 공장 코드입니다 :

factory :user do |f| 
    f.sequence :email do |n| 
    "person#{n}@example.com" 
    end 
    f.password    "thepassword" 
    f.password_confirmation "thepassword" 
end 

factory :customer do |f| 
    f.first_name "First" 
    f.last_name "Last" 
    f.user 
    after_build { |customer| customer.user.user_type = 'customer' } 
end 

답변

1

내가 찾은 해결책은 내 해시를 구성하여 정확하게 원하는대로 보이게 한 다음 바로 앞에 :customer =>없이 직접 전달하는 것입니다.

before(:each) do 
    @customer = Factory(:customer) 
    @customer_attr = Factory.attributes_for(:customer) 
    @user_attr = {:user => Factory.attributes_for(:user)} 
    @customer_and_user_attr = {:customer => @customer_attr }.merge(@user_attr) 

    @admin = Factory(:admin) 
    test_sign_in(@admin.user) 
end 

그런 다음 내 컨트롤러에서 항목으로 액세스합니다.

post :create, @customer_and_user_attr 
0

질문을 올바르게 이해하면에 다른 ​​키를 전달하면됩니다., 즉 :user => @admin.user. 내가 너를 오해 했니?

+0

예, 그렇게 생각하고 두 개의 키는 "나란히"할 필요가 : 같은 params[:customer][:first_name] 또는

params[:user][:email] 그리고 RSpec에 보인다. {: 고객 => {여러 가지 tassocations}, : 사용자 => {여러 가지 tassocations}}로 전달되는 해시가 필요합니다. 사용자가 내부 : 고객 (즉, params [: customer] [: user]) 인 경우 실패합니다. – LikeMaBell

+0

아니요, 동의합니다. 게시 : 생성 : 고객 => @customer_attr : 사용자 => admin.user 은 params [: customer] 및 params [: user]가있는 해시를 제공합니다. – TheDelChop

+0

그래, 내 양식과 컨트롤러를 다시 코딩해야한다. params [: customer] 내부에 사용자 args가 중첩되어있다. 그렇게하면이 문제를 쉽게 해결할 수 있습니다 ... – LikeMaBell