0

给定两个类,Superclass并且Subclass-

如何allow在超类上使用 an 返回不同的东西?

#=> given `rspec` is in your $LOAD_PATH, this should be an SSCCE
require 'rspec'

class Superclass
  def superclass_method
    true
  end
end

class Subclass < Superclass
  def subclass_method
    superclass_method
  end
end

descriptor = RSpec.describe Subclass do
  describe '#subclass_method' do
    subject(:subclass) { described_class.new }

    let(:superclass) { spy('superclass') }

    before do
      stub_const('Superclass', superclass)
      allow(superclass).to receive(:superclass_method).and_return false
    end

    it 'should return false' do
      expect(subclass.subclass_method).to eq(false)
    end
  end
end

p descriptor.run

p descriptor.run上述代码的返回输出false(即测试失败),而true当我将期望更改为expect(subclass.subclass_method).to eq(true).

我觉得我在这里错过了一些简单的东西。

我做了一些调试,我看到了一些东西:

subclass.subclass_method     #=> true
subclass.superclass_method   #=> true
superclass.superclass_method #=> false

我看到这里的第三行很好,但是我不确定从子类调用时如何返回它

4

1 回答 1

0

我完全不用在 Superclass 上使用 double 就可以做到这一点!

我将描述块更改为:

describe '#subclass_method' do
  subject(:subclass) { described_class.new }

  before do
    allow(subclass).to receive(:superclass_method).and_return(false)
  end

  it 'should return false' do
    expect(subclass.subclass_method).to eq(false)
  end
end

我能够在子类的上下文中模拟超类方法,而不是使用间谍和对超类的常量进行存根。‍♂️</p>

于 2021-05-14T23:17:50.287 回答