6

私は多かれ少なかれこのようなシナリオを持っています

class A
  def initialize(&block)
    b = B.new(&block)
  end
end

私はクラス A の単体テストを行っており、B#new が A#new に渡されたブロックを受け取っているかどうかを知りたいです。Mocha をモック フレームワークとして使用しています。

出来ますか?

4

3 に答える 3

2

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
于 2010-07-16T02:31:40.550 に答える
0

私はあなたが欲しいと思います:

l = lambda {}
B.expects(:new).with(l)
A.new(&l)

私はこれがRSpecで動作することを知っています、Mochaが処理しない場合は驚かれることでしょう

于 2010-07-15T02:48:11.943 に答える
0

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
于 2014-12-02T00:46:13.463 に答える