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 功能,请提交问题或提交拉取请求。