这个例子是人为的,请不要把它作为我的代码逐字逐句。
我需要断言如下:
def mymethod
Dir.chdir('/tmp') do
`ls`
end
end
最后我想断言:
我开始时......
Dir.expects(:chdir).with('/tmp')
但之后我不知道如何调用传递给Dir.chdir的块。
答案 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 的位置,它会有所不同。