Как отстаивать блок макета в мокко - PullRequest
5 голосов
/ 24 октября 2011

Этот пример надуманный, пожалуйста, не воспринимайте его дословно как мой код.

Мне нужно утверждать что-то вроде следующего:

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

В конце я хочу сказать, что:

  1. Dir.chdir вызывается с соответствующими параметрами.
  2. `вызывается с соответствующими параметрами

Я начал с ...

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

, но после этого я не уверен, как вызвать блок, переданный в Dir.chdir.

1 Ответ

4 голосов
/ 31 июля 2012

Вам необходимо использовать метод mocha yields .Также довольно интересно написать ожидание для метода backtick .Вы должны сделать ожидание, подобное этому:

expects("`")

Но на каком объекте?Вы можете подумать о Kernel или Object , но на самом деле это не работает.

В качестве примера приведем этот модуль:

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

Часть хитрости заключается в том, чтобы выяснить, к какому объекту ожидать метод backtick .Это зависит от контекста - независимо от того, self , когда этот метод вызывается.Здесь это модуль MyMethod , но в зависимости от того, где вы определяете mymethod , он будет другим.

...