2011-09-02 45 views
0

我正在研究電子商務系統並熟悉RSpec。使用RSpec,should_receive和create來測試setter?

訂單有關聯的付款。訂單完成後,它開始通過我們的支付網關處理付款。

下面是規範,適當的方法和失敗消息。

require 'spec_helper' 

describe Order, "#process_payment" do 
    let!(:user) { create_user } 
    let!(:credit_card) { new_credit_card } 
    let!(:order) { user.orders.create! total: 200 } 
    let!(:payment) { stub('payment', started_processing!: true,) } 

    before do 
    credit_card.stub(sale: true) 
    order.stub(credit_card: credit_card) 
    order.payments.stub(create!: payment) 
    payment.stub(:source= => true, process!: true) 
    end 

    it "creates a payment" do 
    order.payments.should_receive(:create!). 
      with(amount: 200, source: credit_card).and_return payment 
    order.process_payment 
    end 

    it "sets the payment's source to the credit card and tells it to process!" do 
    payment.should_receive(:source=).with(credit_card).ordered 
    payment.should_receive(:process!).ordered 
    order.process_payment 
    end 
end 

這裏是Order類。

class Order < ActiveRecord::Base 
    ... 
    def process_payment 
    payments.create!(amount: total, source: credit_card).tap do |payment| 
     payment.process! 
    end 
    end 
    ... 
end 

第二個規範失敗,聲稱:source =永遠不會被收到。有了訂單,它只是說這個過程!被稱爲亂序。沒有命令,它表示它期望:來源=一次,但從未收到它。我明白爲什麼命令應該在那裏,但只是想清楚它聲稱:source =從未被接收。

是創建!沒有調用source =?測試的適當方法是什麼,以確保正確設置付款來源?

回答

0

我會說你的it "creates a payment"規範就夠了。 create!的行爲責任應該在專門爲它寫的規範中。

如果你真的想確保create!是做什麼它應該,也許嘗試讓process_payment保存到數據庫中,然後調用Payment.last來獲得新的記錄,並檢查它的性能。但我認爲這會過度。

想想這樣,當你編寫控制器規格時,你不會再次測試模型的所有行爲;你只需測試你的控制器與他們的接口。這是一個類似的情況。

+0

夠公平的。將payment.should_receive(:process!)摺疊到該代碼段中? –

+0

是的,抱歉。我昨晚應該抓到了。 – patrickmcgraw