2013-05-15 17 views
8

我想仅在给定特定参数值时用摩卡存根方法,并在给出任何其他值时调用原始方法。摩卡:具有特定参数的刷卡方法,但不适用于其他参数

当我这样做是这样的:

MyClass.any_instance.stubs(:show?).with(:wanne_show).returns(true) 

我得到一个

unexpected invocation for MyClass.show?(:other_value) 

我也知道,写不'with'呼叫模拟的时候,我可以存根所有参数和然后给我具体的模拟。但我必须知道每一个电话,这是不是这样的返回值:/

tldr;有没有办法来调用原来的方法存根或存根只是具体参数,离开其他人呢?

回答

1

问题的答案取决于正是你测试的内容。

的几个注意事项:

1)我总是避免使用stubs.any_instance。你可以在特定的存根/模拟考试,以防止虚假的检测阳性。

2)我更喜欢使用间谍和存根,主动断言某些东西被调用。我们使用bourne宝石用于这一目的。另一种方法是使用一个模拟,如果事情被称为含蓄地测试(例如将失败,如果它被调用。

所以,你的类方法可能看起来是这样的(注意,这是RSpec的语法):

require 'bourne' 
require 'mocha' 

it 'calls MyClass.show?(method_params)' do 
    MyClass.stubs(:show?) 

    AnotherClass.method_which_calls_my_class 

    expect(MyClass).to have_received(:show?).with('parameter!') 
end 

class AnotherClass 
    def self.method_which_calls_my_class 
    MyClass.show?('parameter!') 
    end 
end 

有很多的存根/间谍例子here

希望这有助于

+0

你没有说明如何避免使用'any_instance'虽然在我的经验。需要additi它们嘲笑实例化代码,这些实例代码可能相同,也可能不相同,甚至更容易出错和脆弱。 – gtd