我想测试ChildClass的实例调用something_interesting而省略对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)
任何想法为什么会这样?如何正确地存根?
答案 0 :(得分:3)
我不得不玩这个。这可能是愚蠢的,但我认为这是一种相当明确的方式(没有存根):
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
猴子修补可能有点邪恶但是在测试时是一个很好的工具。
答案 1 :(得分:1)
首先,在BaseClass.any_instance
和ChildClass.new
之间没有连接,你只是在实例中存根方法并期望在另一个实例中存根。
其次,测试并不意味着测试对象的内部部分。如果您正在处理BaseClass'
对象,请对其方法进行测试。如果您正在处理ChildClass'
对象,请检查此对象可以提供的所有内容,不要深入内部。
答案 2 :(得分:-1)
你可以存根super
:
describe ChildClass do
it 'calls something_interesting' do
subject.should_receive(:something_interesting)
subject.stub(:super)
subject.my_method 'a', 'b'
end
end