使用替代框架模拟
除了 rspec、mocha、flexmock 和 RR 外,您还可以选择一个替代框架作为模拟框架。您(或框架作者)只需要提供一个将 RSpec 的事件连接到框架事件的适配器。
模拟框架适配器必须公开三个方法
setup_mocks_for_rspec
- 在每个示例运行之前调用
verify_mocks_for_rspec
- 在每个示例运行后调用
- 这是消息期望失败应该导致错误并显示适当失败消息的地方
teardown_mocks_for_rspec
- 在 `verify_mocks_for_rspec` 后调用
- 使用它来清理资源,将对象恢复到先前状态等
- 即使出现故障也保证运行
使用替代框架模拟
给定一个名为“expector.rb”的文件,其中包含
class Expector
class << self
def expectors
@expectors ||= []
end
def clear_expectors
expectors.clear
end
def verify_expectors
expectors.each {|d| d.verify}
end
end
def initialize
self.class.expectors << self
end
def expectations
@expectations ||= []
end
def expect(message)
expectations << message.to_s
end
def verify
unless expectations.empty?
raise expectations.map {|e|
"expected #{e}, but it was never received"
}.join("\n")
end
end
private
def method_missing(name, *args, &block)
expectations.delete(name.to_s)
end
public
module RSpecAdapter
def setup_mocks_for_rspec
# no setup necessary
end
def verify_mocks_for_rspec
Expector.verify_expectors
end
def teardown_mocks_for_rspec
Expector.clear_expectors
end
end
end
给定一个名为“example_spec.rb”的文件,其中包含
require File.expand_path("../expector", __FILE__)
RSpec.configure do |config|
config.mock_with Expector::RSpecAdapter
end
RSpec.describe Expector do
it "passes when message is received" do
expector = Expector.new
expector.expect(:foo)
expector.foo
end
it "fails when message is received" do
expector = Expector.new
expector.expect(:foo)
end
end
当我运行 `rspec example_spec.rb --format doc` 时
那么退出状态应为 1
并且输出应包含“2 个示例,1 个失败”
并且输出应包含“当收到消息时失败(FAILED - 1)”。