【问题标题】:Mock methods that receives a block as parameter接收块作为参数的模拟方法
【发布时间】:2010-07-15 02:17:05
【问题描述】:

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

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

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

有可能吗?

【问题讨论】:

    标签: ruby testing mocking ruby-mocha


    【解决方案1】:

    我用 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
    

    【讨论】:

      【解决方案2】:

      我想你想要:

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

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

      【讨论】:

      • 没用。我开始相信我不能以这种方式做到这一点。我将在这里尝试另一种方法。谢谢! :)
      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-26
        • 1970-01-01
        • 2020-11-18
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 2014-03-01
        相关资源
        最近更新 更多