6

I have a scenario more or less like this

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

I am unit testing class A and I want to know if B#new is receiving the block passed to A#new. I am using Mocha as mock framework.

Is it possible?

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

是否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 回答
0

我想你想要:

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

我知道这适用于 RSpec,如果 Mocha 不能处理,我会感到惊讶

于 2010-07-15T02:48:11.943 回答