如何用rspec测试ruby继承

bre*_*ter 12 ruby rspec

我试图测试在类继承期间运行的逻辑,但在运行多个断言时遇到了问题.

我第一次尝试......

describe 'self.inherited' do
  before do
    class Foo
      def self.inherited klass; end
    end

    Foo.stub(:inherited)

    class Bar < Foo; end
  end

  it 'should call self.inherited' do
    # this fails if it doesn't run first
    expect(Foo).to have_received(:inherited).with Bar
  end

  it 'should do something else' do
    expect(true).to eq true
  end
end
Run Code Online (Sandbox Code Playgroud)

但是这会失败,因为Bar类已经加载,因此不会inherited第二次调用.如果断言没有先运行......它就失败了.

那么我尝试了类似......

describe 'self.inherited once' do
  before do
    class Foo
      def self.inherited klass; end
    end

    Foo.stub(:inherited)

    class Bar < Foo; end
  end

  it 'should call self.inherited' do
    @tested ||= false
    unless @tested
      expect(Foo).to have_receive(:inherited).with Bar
      @tested = true
    end
  end

  it 'should do something else' do
    expect(true).to eq true
  end
end
Run Code Online (Sandbox Code Playgroud)

因为@tested从测试到测试不会持续,测试不会只运行一次.

有谁有任何聪明的方法来实现这一目标?这是一个人为的例子,我实际上并不需要测试ruby本身;)

小智 37

这是使用RSpec测试类继承的简单方法:

特定

class A < B; end
Run Code Online (Sandbox Code Playgroud)

使用RSpec测试继承的一种更简单的方法是:

describe A do
  it { expect(described_class).to be < B }
end
Run Code Online (Sandbox Code Playgroud)

  • 不错的答案!可以在这里找到解释:http://ruby-doc.org/core-2.3.0/Module.html#method-i-3C (2认同)

dim*_*nyc 6

对于这样的事情

class Child < Parent; end
Run Code Online (Sandbox Code Playgroud)

我通常这样做:

it 'should inherit behavior from Parent' do
  expect(Child.superclass).to eq(Parent)
end
Run Code Online (Sandbox Code Playgroud)