2014-04-12 143 views
8

我想測試在類繼承期間運行的邏輯,但在運行多個斷言時遇到了問題。如何使用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不從測試堅持到測試,測試不只是運行一次。

任何人有任何聰明的方法來實現這一目標?這是一個人爲的例子,我不實際上需要測試紅寶石本身;)

+0

測試的行爲,而不是執行。測試類是否從繼承類繼承將是合理的,只有當方法在做元編程的東西時(比如構造類和設置祖先) –

回答

24

這裏有一個簡單的方法來測試類繼承使用RSpec:

鑑於

class A < B; end 

一個更簡單的方法使用RSpec來測試繼承:

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

好的答案!解釋可以在這裏找到:http://ruby-doc.org/core-2.3.0/Module.html#method-i-3C –

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 
+0

這麼簡單...當然只是使用不同的類......謝謝! – brewster

1

由於某種原因,我沒有管理solution from David Posey工作(我想我做錯了什麼。隨意在評論中提供解決方案)。如果有人在那裏有同樣的問題,這個工程太:

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

這樣的事情

class Child < Parent; end 

我通常做的:

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