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