接收次数
当 预期消息 时,你可以指定预期消息接收的次数
* `expect(...).to receive(...).once`
* `expect(...).to receive(...).twice`
* `expect(...).to receive(...).exactly(n).time`
* `expect(...).to receive(...).exactly(n).times`
* `expect(...).to receive(...).at_least(:once)`
* `expect(...).to receive(...).at_least(:twice)`
* `expect(...).to receive(...).at_least(n).time`
* `expect(...).to receive(...).at_least(n).times`
* `expect(...).to receive(...).at_most(:once)`
* `expect(...).to receive(...).at_most(:twice)`
* `expect(...).to receive(...).at_most(n).time`
* `expect(...).to receive(...).at_most(n).times`
如果你没有指定预期的接收次数,则默认为 `once`。
背景
给定一个名为 “lib/account.rb” 的文件,内容为
class Account
def initialize(logger)
@logger = logger
end
def open
@logger.account_opened
end
end
通过示例
给定一个名为 “spec/account_spec.rb” 的文件,内容为
require 'account'
RSpec.describe Account do
let(:logger) { double("Logger") }
let(:account) { Account.new(logger) }
example "once" do
expect(logger).to receive(:account_opened).once
account.open
end
example "twice" do
expect(logger).to receive(:account_opened).twice
account.open
account.open
end
example "exactly(n).time" do
expect(logger).to receive(:account_opened).exactly(1).time
account.open
end
example "exactly(n).times" do
expect(logger).to receive(:account_opened).exactly(3).times
account.open
account.open
account.open
end
example "at_least(:once)" do
expect(logger).to receive(:account_opened).at_least(:once)
account.open
account.open
end
example "at_least(:twice)" do
expect(logger).to receive(:account_opened).at_least(:twice)
account.open
account.open
account.open
end
example "at_least(n).time" do
expect(logger).to receive(:account_opened).at_least(1).time
account.open
end
example "at_least(n).times" do
expect(logger).to receive(:account_opened).at_least(3).times
account.open
account.open
account.open
account.open
end
example "at_most(:once)" do
expect(logger).to receive(:account_opened).at_most(:once)
end
example "at_most(:twice)" do
expect(logger).to receive(:account_opened).at_most(:twice)
account.open
end
example "at_most(n).time" do
expect(logger).to receive(:account_opened).at_most(1).time
account.open
end
example "at_most(n).times" do
expect(logger).to receive(:account_opened).at_most(3).times
account.open
account.open
end
end
当我运行 rspec spec/account_spec.rb
那么这些示例应该全部通过。
失败示例
给定一个名为 “spec/account_spec.rb” 的文件,内容为
require 'account'
RSpec.describe Account do
let(:logger) { double("Logger") }
let(:account) { Account.new(logger) }
example "once" do
expect(logger).to receive(:account_opened).once
account.open
account.open
end
example "twice" do
expect(logger).to receive(:account_opened).twice
account.open
end
example "exactly(n).times" do
expect(logger).to receive(:account_opened).exactly(3).times
account.open
account.open
end
example "at_least(:once)" do
expect(logger).to receive(:account_opened).at_least(:once)
end
example "at_least(:twice)" do
expect(logger).to receive(:account_opened).at_least(:twice)
account.open
end
example "at_least(n).times" do
expect(logger).to receive(:account_opened).at_least(3).times
account.open
account.open
end
example "at_most(:once)" do
expect(logger).to receive(:account_opened).at_most(:once)
account.open
account.open
end
example "at_most(:twice)" do
expect(logger).to receive(:account_opened).at_most(:twice)
account.open
account.open
account.open
end
example "at_most(n).times" do
expect(logger).to receive(:account_opened).at_most(3).times
account.open
account.open
account.open
account.open
end
end
当我运行 rspec spec/account_spec.rb --order defined
那么这些示例应该全部失败,并输出以下内容
预期:1 次,使用任何参数 |
接收:2 次 |
预期:2 次,使用任何参数 |
接收:1 次,使用任何参数 |
预期:3 次,使用任何参数 |
接收:2 次,使用任何参数 |
预期:至少 1 次,使用任何参数 |
接收:0 次,使用任何参数 |
预期:至少 2 次,使用任何参数 |
接收:1 次,使用任何参数 |
预期:至少 3 次,使用任何参数 |
接收:2 次,使用任何参数 |
预期:最多 1 次,使用任何参数 |
接收:2 次 |
预期:最多 2 次,使用任何参数 |
接收:3 次 |
预期:最多 3 次,使用任何参数 |
接收:4 次 |