【发布时间】:2020-02-12 20:47:06
【问题描述】:
我正在尝试测试在类继承期间运行的逻辑,但在运行多个断言时遇到了问题。
我第一次尝试...
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 本身;)
【问题讨论】:
-
测试行为,而不是执行。仅当方法正在执行元编程(例如构造类和设置祖先)时,测试类是否继承自来类才是合理的