我试图测试在类继承期间运行的逻辑,但在运行多个断言时遇到了问题.
我第一次尝试......
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)
对于这样的事情
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)