我有一个模块:
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
答案 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