2012-02-26 15 views
2

rspec(v 2.6.1)post :createで渡される引数を調整するにはどうすればよいですか?このコマンドについて説明しているrspecのドキュメントと、それを使用する方法を私に教えてもらうといいでしょう。私は見に行きましたが、私の質問に答えるものは何も見つかりません。rspec POSTで渡されるハッシュを変更する

お客様のために正しく動作するようにrspecを作成するのが難しいです:顧客と異なるUserオブジェクトの両方のパラメータを受け取るアクションを作成してください。より正確には、私はrspecポストで渡したハッシュの値を取得することができません:私のフォームから来る入力のように動作するように作成します。

私のCustomerとUserオブジェクトは、別々のActiveRecordsであり、各Customer:は、Userに属しています。ここで

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 doesnの」私は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 

次に、私のコントローラで、私はアイテムとしてアクセスします。 params[:customer][:first_name]またはparams[:user][:email]

そしてRSpecのは、次のようになります。

post :create, @customer_and_user_attr 
0

あなたの質問が正しく理解されたら、別のキーをに渡すだけで済みます、すなわち:user => @admin.user。私はあなたを誤解しましたか?

+0

はい、私はそう思う、と2つのキーが「横並び」にする必要があります。私は、{:customer => {#さまざまなtassocations}、:user => {さまざまなtassocations}}のように渡されるハッシュが必要です。 userが内部:顧客(つまり、params [:customer] [:user])の場合は失敗します。 – LikeMaBell

+0

いいえ私は同意する、私は理解する。 post:create、:customer => @customer_attr、:user => admin.user はparams [:customer]とparams [:user]を持つハッシュを取得します。 – TheDelChop

+0

さて、フォームとコントローラを探し直すだけで、params [:customer]の中にネストされたユーザーargsを再コーディングする必要があるようです。それはこの問題を解決するのが簡単になります... – LikeMaBell

関連する問題