模拟接收块作为参数的方法

时间:2010-07-15 02:17:05

标签: ruby testing mocking mocha

我有一个或多或少像这样的场景

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

我是单元测试A类,我想知道B#new是否正在接收传递给A#new的块。我使用Mocha作为模拟框架。

有可能吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我想你想要:

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

我知道这适用于RSpec,如果Mocha不处理

,我会感到惊讶

答案 2 :(得分: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