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

时间:2012-07-16 07:28:33

标签: ruby rspec

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

任何想法为什么会这样?如何正确地存根?

3 个答案:

答案 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_instanceChildClass.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