如何在RSpec中存根接受多个参数的基类方法



我想测试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_instanceChildClass.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

最新更新