如何使用RSpec和Mocha调用混合类方法?

时间:2013-05-15 21:44:23

标签: ruby rspec mocking mocha

我有一个模块:

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

2 个答案:

答案 0 :(得分:6)

嗯,这是一个解决方案。

正如我在this SO post中提到的,模拟/存根有两种策略:

1)使用mocha的expects将在测试结束时自动断言。在您的情况下,这意味着如果在MyCommand.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的匹配器来查看是否在“MyCommand”上调用了:do_something

答案 1 :(得分:5)

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

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