如何用rspec测试ruby继承

时间:2014-04-12 06:55:17

标签: 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

但由于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

因为@tested从测试到测试都没有持续,测试不会只运行一次。

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

5 个答案:

答案 0 :(得分:32)

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

鉴于

class A < B; end

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

describe A do
  it { expect(described_class).to be < B }
end

答案 1 :(得分:3)

对于像这样的事情

class Child < Parent; end

我通常会这样做:

it 'should inherit behavior from Parent' do
  expect(Child.superclass).to eq(Parent)
end

答案 2 :(得分:1)

出于某种原因,我没有管理solution from David Posey工作(我想我做错了。请随意在评论中提供解决方案)。如果有人有同样的问题,这也有效:

describe A
  it { expect(described_class.superclass).to be B }
end

答案 3 :(得分:1)

另一种方式:

class Foo; end
class Bar < Foo; end
class Baz; end

RSpec.describe do
  it 'is inherited' do
    expect(Bar < Foo).to eq true
  end

  it 'is not inherited' do
    expect(Baz < Foo).not_to eq true
  end
end

答案 4 :(得分:0)

在测试期间运行测试继承的类定义:

describe 'self.inherited' do

  before do
    class Foo
      def self.inherited klass; end
    end
    # For testing other properties of subclasses
    class Baz < Foo; end 
  end

  it 'should call self.inherited' do
    Foo.stub(:inherited)
    class Bar < Foo; end
    expect(Foo).to have_received(:inherited).with Bar
  end

  it 'should do something else' do
    expect(true).to eq true
  end
end