我想测试ChildClass的实例调用something_interest,同时省略对BaseClass.my_method 的调用
class BaseClass
def my_method *args, &block
end
end
class ChildClass < BaseClass
def my_method first_arg, second_arg
something_interesting
super first_arg, second_arg
end
end
如果我这样写我的测试:
subject = ChildClass.new
subject.should_receive :something_interesting
BaseClass.any_instance.stub :my_method
subject.my_method
我得到错误:
ArgumentError:参数数量错误(3对2)
你知道为什么会这样吗?如何正确地将其截断?
我不得不玩一下这个。这可能很愚蠢,但我认为这是一种相当明确的方法(不需要存根):
require 'rspec'
class BaseClass
def my_method *args, &block
raise 'hell'
end
end
class ChildClass < BaseClass
def my_method first_arg, second_arg
something_interesting
super first_arg, second_arg
end
def something_interesting
end
end
describe ChildClass do
it "should work" do
class BaseClass
def my_method *args, &block
end
end
subject = ChildClass.new
subject.should_receive :something_interesting
subject.my_method 'two', 'args'
end
end
Monkey补丁可能有点邪恶,但在测试时是一个很好的工具。
首先,无形BaseClass.any_instance
和ChildClass.new
之间没有连接,您只是在实例中研究了方法,并期望在另一个实例中进行存根。
其次,测试并不意味着测试对象的内部部分。如果您正在处理BaseClass'
对象,请测试它的方法。如果您正在处理ChildClass'
对象,请检查该对象能想到的所有内容,不要深入内部。
您可以截尾super
:
describe ChildClass do
it 'calls something_interesting' do
subject.should_receive(:something_interesting)
subject.stub(:super)
subject.my_method 'a', 'b'
end
end