如何在摩卡中断言模拟块

发布于 2024-12-12 02:23:59 字数 339 浏览 0 评论 0原文

这个例子是人为的,请不要将其逐字作为我的代码。

我需要断言如下:

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

最后我想断言:

  1. Dir.chdir 是通过适当的参数。
  2. 适当参数调用

` 使用我开始时使用的

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

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

This example is contrived, please don't take it verbatim as my code.

I have the need to assert something like the following:

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

In the end I want to assert that:

  1. Dir.chdir is invoked with the appropriate parameters.
  2. ` is invoked with the appropriate parameters

I started off with...

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

but after that I'm not sure how to invoke the block passed to Dir.chdir.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哆兒滾 2024-12-19 02:23:59

您需要使用摩卡 yields 方法。另外,为 backtick 方法编写一个期望是相当有趣的。你需要做出这样的期望:

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 的位置,它会有所不同。

You need to use the mocha yields method. Also, writing an expectation for the backtick method is rather interesting. You need to make an expectation like this:

expects("`")

But on what object? You might think on Kernel or Object, but that doesn't actually work.

As an example, given this module:

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

I could write a test like this:

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

Part of the trick is to figure out which object to expect the backtick method to be invoked on. It depends on the context - whatever self is when that method is invoked. Here it is the module MyMethod, but depending on where you define mymethod it will be different.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文