1

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

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

4

3 回答 3

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

Monkey patching 可能有点邪恶,但在测试时是一个不错的工具。

于 2012-07-16T17:07:09.797 回答
1

首先, intancesBaseClass.any_instance和之间没有联系ChildClass.new,您只是在实例中存根方法并期望在另一个实例中存根。

其次,测试并不意味着测试对象的内部部分。如果您正在处理BaseClass'对象,请对其方法进行测试。如果您正在处理ChildClass'对象,请检查该对象可以提出的所有内容,不要深入内部。

于 2012-07-16T09:43:36.890 回答
-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
于 2012-07-16T18:21:42.857 回答