メインコンテンツまでスキップ

代替フレームワークを使用したモック

RSpec、Mocha、FlexMock、RRに加えて、モックフレームワークとして代替フレームワークを選択することができます。あなた(またはフレームワークの作者)は、RSpecのイベントをフレームワークのイベントにフックするアダプタを提供する必要があります。

モックフレームワークのアダプタは、次の3つのメソッドを公開する必要があります:

  • setup_mocks_for_rspec
    • 各exampleが実行される前に呼び出されます
  • verify_mocks_for_rspec
    • 各exampleが実行された後に呼び出されます
    • ここでメッセージの期待値の失敗は、適切な失敗メッセージとともにエラーにするべきです
  • teardown_mocks_for_rspec
    • verify_mocks_for_rspecの後に呼び出されます
    • これを使用してリソースをクリーンアップしたり、オブジェクトを以前の状態に復元したりします
    • 失敗があっても必ず実行されることが保証されています

代替フレームワークを使用したモック

Given "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

Given "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

When rspec example_spec.rb --format doc を実行すると

Then 終了ステータスは1であるべきであり、

And 出力に "2 examples, 1 failure" が含まれているべきであり、

And 出力に "fails when message is received (FAILED - 1)" が含まれているべきである。