如何在mocha中断言模拟块

时间:2011-10-24 16:28:20

标签: ruby unit-testing mocking mocha

这个例子是人为的,请不要把它作为我的代码逐字逐句。

我需要断言如下:

def mymethod
    Dir.chdir('/tmp') do
        `ls`
    end
end

最后我想断言:

  1. 使用适当的参数调用Dir.chdir。
  2. 使用适当的参数调用
  3. `

    我开始时......

    Dir.expects(:chdir).with('/tmp')
    

    但之后我不知道如何调用传递给Dir.chdir的块。

1 个答案:

答案 0 :(得分:4)

您需要使用mocha yields方法。另外,编写对反引号方法的期望是相当有趣的。你需要做出这样的期望:

expects("`")

但是对于什么对象?您可能会想到内核对象,但这实际上并不起作用。

作为一个例子,给定这个模块:

module MyMethod
  def self.mymethod
    Dir.chdir('/tmp') do
      `ls`
    end
  end
end

我可以写一个这样的测试:

class MyMethodTest < Test::Unit::TestCase
  def test_my_method
    mock_block = mock
    mock_directory_contents = mock
    MyMethod.expects("`").with('ls').returns(mock_directory_contents)
    Dir.expects(:chdir).yields(mock_block).returns(mock_directory_contents)
    assert_equal mock_directory_contents, MyMethod.mymethod
  end
end

部分技巧是找出期望调用反引号方法的对象。它取决于上下文 - 无论 self 是什么时候调用该方法。这是模块 MyMethod ,但根据您定义 mymethod 的位置,它会有所不同。