5

我有一个模块:

module MyModule
  def do_something
    # ...
  end
end

类使用如下:

class MyCommand
  extend MyModule

  def self.execute
    # ...
    do_something
  end
end

如何验证MyCommand.execute电话do_something?我曾尝试使用 mocha 进行部分模拟,但在do_something不调用时它不会失败:

it "calls do_something" do
  MyCommand.stubs(:do_something)
  MyCommand.execute
end
4

2 回答 2

6

嗯,这是一种解决方案。

正如我在这篇 SO 帖子中提到的,有两种模拟/存根策略:

1) 使用 mocha'sexpects将在测试结束时自动断言。在您的情况下,这意味着如果在 ingMyCommand.execute之后没有调用expects它,则测试将失败。

2)更具体/更自信的方法是使用存根和间谍的组合。存根使用您指定的行为创建假对象,然后间谍检查是否有人调用该方法。要使用您的示例(注意这是 RSpec):

require 'mocha'
require 'bourne'

it 'calls :do_something when .execute is run' do
  AnotherClass.stubs(:do_something)

  MyCommand.execute

  expect(AnotherClass).to have_received(:do_something)
end

# my_command.rb
class MyCommand
  def self.execute
    AnotherClass.do_something
  end
end

因此,该expect行使用bourne的匹配器来检查是否:do_something在 `MyCommand.

于 2013-05-16T03:39:42.710 回答
5

好的,看起来expects是解决方案:

it "calls do_something" do
  MyCommand.expects(:do_something)
  MyCommand.execute
end
于 2013-05-15T21:58:26.257 回答