代替フレームワークを使用したモック
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)" が含まれているべきである。