【问题标题】:Testing setters with RSpec, should_receive, and create?使用 RSpec、should_receive 和 create 测试设置器?
【发布时间】:2011-09-02 01:55:58
【问题描述】:

我正在开发电子商务系统并熟悉 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= 从未被接收到。

正在创建!不调用 source=?什么是适当的测试方法以确保正确设置付款来源?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord rspec tdd


    【解决方案1】:

    我会说你的it "creates a payment" 规范就足够了。 create! 行为的责任应该在专门为其编写的规范中。

    如果你真的想确保create! 正在做它应该做的事情,也许尝试让process_payment 保存到数据库然后调用Payment.last 来获取新记录并检查它的属性。但我认为这太过分了。

    这样想,当您编写控制器规范时,您不会再次测试模型的所有行为;您只需测试您的控制器如何与它们交互。这是类似的情况。

    【讨论】:

    • 很公平。将 payment.should_receive(:process!) 也折叠到那段代码中?
    • 是的,对不起。昨晚我应该抓到的。
    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多