rspec

2014-04-12 8 views
8

के साथ रूबी विरासत का परीक्षण कैसे करें मैं वर्ग विरासत के दौरान चलने वाले तर्क का परीक्षण करने की कोशिश कर रहा हूं, लेकिन कई दावों को चलाने के दौरान एक समस्या में भाग लेता हूं।rspec

मैं पहले की कोशिश की ...

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 

लेकिन यह विफल रहता है क्योंकि बार वर्ग पहले से ही लोड किया गया है, और इसलिए एक 2 बार फोन नहीं करता है 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 परीक्षण से मौजूद नहीं होता परीक्षण करने के लिए, परीक्षण सिर्फ एक बार नहीं चलता है।

किसी को भी इसे पूरा करने के लिए कोई चालाक तरीका है? यह एक काल्पनिक उदाहरण है और मुझे नहीं वास्तव में ही गहरे लाल रंग का परीक्षण करने की जरूरत है;)

+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 का प्रबंधन नहीं किया (मुझे लगता है कि मैंने कुछ गलत किया है। टिप्पणियों में समाधान प्रदान करने के लिए स्वतंत्र महसूस करें)। मामले में किसी को वहाँ बाहर एक ही समस्या है में, यह भी काम करता है: इस

class Child < Parent; end 

तरह

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

कुछ के लिए मैं आम तौर पर कार्य करें:

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

 संबंधित मुद्दे