通過設定預期的訊息期望來進行模擬
下面的例子使用 expect
和 receive
來模擬 Order
對 CreditCardService
的呼叫,這樣只有在呼叫完成而不必實際呼叫時,測試才會通過。
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
。