使用替代框架模拟

除了 rspec、mocha、flexmock 和 RR 外,您还可以选择一个替代框架作为模拟框架。您(或框架作者)只需要提供一个将 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)”。