2016-02-01 6 views
4

Мне нужно написать, что новый объект будет создан в платежной системе. Код, включенный в order.rborder_spec.rb и (Order класс here):Ожидайте создания нового объекта

#order.rb 

def confirm_order(method_of_payment) 
    if credit_card_but_products_out_stock?(method_of_payment) 
    raise "Cannot make credit card payment now, as some products are out of stock" 
    end 

    order_total 
    Payment.new(method_of_payment, self.total) 
end 

#order_spec.rb 

it 'it creates a new payment object if method_of_payment is valid and order.total is > 0' do 
    order.add_product(product, 3) 
    order.confirm_order(:credit_card) 
    #Expect that a new payment object is created. 
end 

Я хочу, чтобы понять, как я могу написать соответствующую спецификацию, чтобы проверить, что новый объект оплаты создается. Я нашел this article от Semaphore CI полезным, но я не уверен в решении. Я почти уверен, что мне нужно создать двойную пробную версию, а затем, возможно, метод stub to allow(order).to receive(:confirm_order).and_return(#new_object??).

ответ

8

Если вы тестируете устройство класса Order, то вы не должны издеваться или стучать по классу Order. Вы можете установить ожидание класса Payment, чтобы вернуть макет, который затем можно далее утверждать как возвращаемое значение метода confirm_order.

let(:payment) { double :payment } 

it "returns a payment" do 
    expect(Payment).to receive(:new).with(:credit_card).and_return(payment) 

    order.add_product(product, 3) 
    expect(order.confirm_order(:credit_card)).to eq(payment) 
end 

Таким образом, вы насмешливый зависимостей вашего Order класса, не изменяя Order класс, который является гораздо более безопасным, как насмешливый метод на Order может легко создать ложноположительные результаты теста.

+0

Очень ясно - спасибо. –