我想測試在類繼承期間運行的邏輯,但在運行多個斷言時遇到了問題。如何使用rspec測試ruby繼承
我第一次嘗試......
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
但這種失敗,因爲酒吧類已經被加載,因此不叫inherited
第2個時間。如果斷言不首先運行......它會失敗。
於是我想是這樣......
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
不從測試堅持到測試,測試不只是運行一次。
任何人有任何聰明的方法來實現這一目標?這是一個人爲的例子,我不實際上需要測試紅寶石本身;)
測試的行爲,而不是執行。測試類是否從繼承類繼承將是合理的,只有當方法在做元編程的東西時(比如構造類和設置祖先) –