私は多かれ少なかれこのようなシナリオを持っています
class A
def initialize(&block)
b = B.new(&block)
end
end
私はクラス A の単体テストを行っており、B#new が A#new に渡されたブロックを受け取っているかどうかを知りたいです。Mocha をモック フレームワークとして使用しています。
出来ますか?
私は多かれ少なかれこのようなシナリオを持っています
class A
def initialize(&block)
b = B.new(&block)
end
end
私はクラス A の単体テストを行っており、B#new が A#new に渡されたブロックを受け取っているかどうかを知りたいです。Mocha をモック フレームワークとして使用しています。
出来ますか?
MochaとRSpecの両方でこれを試しましたが、合格テストを取得できましたが、動作が正しくありませんでした。私の実験から、ブロックが渡されたことを確認することは不可能であると結論付けました。
質問:なぜブロックをパラメーターとして渡したいのですか?ブロックはどのような目的に役立ちますか?いつ呼ばれるべきですか?
たぶん、これは本当にあなたが次のようなものでテストすべき振る舞いです:
class BlockParamTest < Test::Unit::TestCase
def test_block_passed_during_initialization_works_like_a_champ
l = lambda {|name| puts "Hello #{name}"}
l.expects(:call).with("Bryan")
A.new(&l)
end
end
私はあなたが欲しいと思います:
l = lambda {}
B.expects(:new).with(l)
A.new(&l)
私はこれがRSpecで動作することを知っています、Mochaが処理しない場合は驚かれることでしょう
B::new
ブロックに譲歩しており、ブロックは提供するパラメーターを変更しますyield
か? はいの場合は、次の方法でテストできます。
require 'minitest/autorun'
require 'mocha/setup'
describe 'A' do
describe '::new' do
it 'passes the block to B' do
params = {}
block = lambda {|p| p[:key] = :value }
B.expects(:new).yields(params)
A.new(&block)
params[:key].must_equal :value
end
end
end