RSpec Mocks
rspec-mocks 透過讓您設定已知的回傳值、方法的虛擬實作,甚至設定特定訊息被物件接收的預期,來協助控制程式碼範例中的上下文。
您可以在 rspec-mocks 為您即時建立的測試替身上執行這三件事,或者在屬於您系統一部分的物件上執行這些事。
訊息和方法
訊息 和 方法 是我們在某種程度上可以互換使用的隱喻,但它們之間存在細微的差異。在物件導向程式設計中,物件透過互相傳送訊息 來進行溝通。當物件收到訊息時,它會調用與訊息名稱相同的方法。
測試替身
測試替身是在程式碼範例中代表系統中另一個物件的物件。使用 `double` 方法,傳遞可選的識別符號來建立一個
book = double("book")
大多數時候,您會希望有某種程度的信心,確定您的替身與系統中的現有物件相似。驗證替身是為此目的而提供的。如果現有物件可用,它們會阻止您為不存在或具有無效參數的方法新增存根和預期。
book = instance_double("Book", :pages => 250)
驗證替身 有一些巧妙的技巧,讓您可以在不載入依賴項的情況下進行隔離測試,同時仍然可以根據真實物件進行驗證。
方法存根
方法存根是指示物件(真實或測試替身)在收到訊息時回傳已知值
allow(die).to receive(:roll) { 3 }
這會告知 `die` 物件在收到 `roll` 訊息時回傳值 `3`。
訊息預期
訊息預期是指物件應在程式碼範例的過程中收到特定訊息的預期
describe Account do
context "when closed" do
it "logs an 'account closed' message" do
logger = double()
account = Account.new
account.logger = logger
expect(logger).to receive(:account_closed).with(account)
account.close
end
end
end
此範例指定 `account` 物件在收到 `close` 訊息時,會將 `account_closed` 訊息(以自身作為參數)傳送給 `logger`。
問題
rspec-mocks 的文件仍在開發中。我們將隨著時間的推移新增 Cucumber 功能,並澄清現有的功能。如果您有希望新增的特定功能,發現現有的文件不完整或令人困惑,或者更好的是,希望自己撰寫遺失的 Cucumber 功能,請提交問題或提出 pull request。