2011-09-02 2 views
0

저는 전자 상거래 시스템을 연구 중이며 RSpec에 익숙합니다.RSpec, should_receive 및 create를 사용하여 설정 도구를 테스트합니까?

주문과 관련된 지불이 있습니다. 주문이 완료되면 Google 결제 게이트웨이를 통해 결제 처리가 시작됩니다.

다음은 사양, 적절한 방법 및 실패 메시지입니다.

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 클래스입니다.

두 번째 사양은 실패합니다. source = 수신하지 못했습니다. 명령을 내리면, 그 과정을 말합니다! 순서가 잘못되었습니다. 주문하지 않으면, 그것은 예상했다 : 근원 = 한 번, 그러나 그것을 결코받지 않았다. 나는 주문한 이유가 무엇인지 이해하지만 단지 그것이 소스가 결코 받아 들여지지 않는다고 주장하고 있다는 것을 분명히하고 싶었습니다.

작성 중입니다! 소스가 아님 = =? 출처가 지불에 올바르게 설정되어 있는지 테스트하기위한 적절한 방법은 무엇입니까?

답변

0

귀하의 it "creates a payment" 사양으로 충분합니다. create!의 작동에 대한 책임은 특별히 작성된 스펙에 나와 있어야합니다.

당신이 정말로 create! 아마도 다음 새 레코드를 가져 그것에 속성을 확인하는 Payment.last 전화를 데이터베이스에 저장 process_payment를시키는 시도가에 해야하는 일을되어 있는지 확인하려면

. 하지만 과잉이라고 생각합니다.

이런 식으로 생각하면 컨트롤러 사양을 작성할 때 모델의 모든 동작을 다시 테스트하지 않아도됩니다. 컨트롤러가 컨트롤러와 어떻게 인터페이스하는지 테스트하면됩니다. 이것은 비슷한 상황입니다.

+0

충분합니다. payment.should_receive (: process!)를 코드의 해당 섹션에도 접 힙니다. –

+0

예, 죄송합니다. 어젯밤에 그걸 잡았어야 했어. – patrickmcgraw

관련 문제