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` 消息时,它会向 `logger` 发送 `account_closed` 消息(以自身作为参数)。

问题

rspec-mocks 的文档仍在完善中。我们会随着时间的推移添加 Cucumber 功能,并澄清现有功能。如果您想添加特定的功能,发现现有文档不完整或令人困惑,或者,更棒的是,您想自己编写缺失的 Cucumber 功能,请提交问题提交拉取请求