通過設定預期的訊息期望來進行模擬
下面的例子使用 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。