2012-02-19 5 views
1

たとえば、RailsアプリケーションにはCustomerクラスとCardクラスの2つのクラスがあります。 CustomerクラスはCardクラスで構成されています。つまり、顧客にはカードがあります。RSpecを使用して合成オブジェクトのプロパティの設定をテストするにはどうすればよいですか?

次に、POSTで渡されたparamsを使用してCustomerの新しいインスタンスを初期化し(内部的にCardの新しいインスタンスを作成する)do_somethingアクションが定義されたRailsコントローラを作成しました。

次のようにカードの数は、その後設定されている:

class ShopController < ApplicationController 
    def do_something 
     customer = Customer.new params 
     customer.card.number = params[:card_number] 
     ... 
    end 
end 

RSpecのテストでテストカード番号のこの割り当てはどのように?理想的には、 'should_receive_chain'が存在する場合、次のように書くことができます。

describe MyController do 
    describe "POST 'do_something'" do 
     it "should set card number" 
      params = { :card_number => '1234' } 
      card_mock.should_receive_chain(:card, :number).with '1234' 
      post :do_something 
     end 
    end 
end 

アイデアはありますか?おそらく、それが簡単にテストできないという事実はコードのにおいであり、おそらく私はCustomerクラスでセッターメソッドを作成するべきでしょうか?

答えて

0

私はこれを間違ったレベルでテストしていると思います。別の明細書にカード番号を設定することをお勧めする場合は、これを手助けする機能を作成する方が良いかもしれません。

params[:customer][:card_attributes][:card_number] 
:簡単な解決策は、カード番号を設定すると自動的に行われるように、単にあなたの形式でパラメータに名前を付けるかもしれない

class ShopController < ApplicationController 
    def do_something 
    customer = Customer.new_with_card_number(params, params[:card_number]) 
    end 
end 

:あなたは、その後に自分のコントローラを変更することができ

class Customer 
    def self.new_with_card_number(params, number) 
    customer = new(params) 
    customer.card.number = number 
    customer 
    end 
end 

describe Customer do 
    it 'creates a card with a number' do 
    customer = described_class.new_with_card_number({}, '1234') 
    customer.card.number.should == '1234' 
    end 
end 

これで、電話をcustomer = Customer.new(params)に変更することができます。

0

私は、あなたのスペックは

describe ShopController do 
    describe 'POST /do_something' do 
    it "sets the card's card number" do 
     post :do_something, :customer => 
           { 
           :card_attributes => {:card_number => '1234'} 
           } 
     Customer.last.card.number.should == '1234' 
    end 
    end 
end 
のように見えることができます accepted_nested_attributes_for :cardを追加し、

class ShopController < ApplicationController 
    def do_something 
    customer = Customer.create params[:customer] 
    ... 
    end 
end 

にコントローラのアクションを変更するために顧客モデルを変更します

関連する問題