通過設定預期的訊息期望來進行模擬

下面的例子使用 expectreceive 來模擬 OrderCreditCardService 的呼叫,這樣只有在呼叫完成而不必實際呼叫時,測試才會通過。

class Order
  def cancel
     CreditCardService.instance.refund transaction_id
  end
end

describe Order do
  describe '#cancel' do
    it "refunds the money" do
      order = Order.new
      order.transaction_id = "transaction_id"
      expect(CreditCardService.instance).to receive(:refund).with("transaction_id")
      order.cancel
    end
  end
end

在這個例子中,模擬是 CreditCardService.instance 的返回值,它可能是一個單例。

with 是可選的; 如果沒有它,任何對 refund 的呼叫都會滿足期望。and_return 可以給出一個返回值; 在這個例子中它沒有被使用,所以呼叫返回 nil