我正在尝试测试在类继承期间运行的逻辑,但在运行多个断言时遇到了问题。
我第一次尝试......
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本身;)
答案 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