Тестирование сеттеров с помощью RSpec, should_receive и create? - PullRequest
0 голосов
/ 02 сентября 2011

Я работаю над системой электронной коммерции и знакомлюсь с RSpec.

Заказ связан с платежом.Когда заказ завершен, он начинает обрабатывать платеж через наш платежный шлюз.

Ниже приведена спецификация, соответствующий метод и сообщение об ошибке.

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 = никогда не принимается.

Создает!не вызывать источник =?Как правильно проверить, правильно ли указан источник платежа?

1 Ответ

0 голосов
/ 02 сентября 2011

Я бы сказал, что вашей it "creates a payment" спецификации достаточно. Ответственность за поведение create! должна быть в спецификации, написанной специально для него.

Если вы действительно хотите убедиться, что create! делает то, что должен, возможно, попробуйте process_payment сохранить в базе данных, затем вызовите Payment.last, чтобы получить новую запись и проверить свойства в ней. Но я думаю, это было бы излишним.

Думайте об этом так, когда вы пишете спецификации контроллера, вы больше не проверяете все поведение ваших моделей; Вы просто проверяете, как ваш контроллер взаимодействует с ними. Это похожая ситуация.

...