2014-04-12 19 views
8

Próbuję przetestować logikę, która działa podczas dziedziczenia klasy, ale napotkałem problem podczas uruchamiania wielu asercji.Jak przetestować dziedziczenie ruby ​​za pomocą rspec

raz pierwszy spróbował ...

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 

ale to się nie powiedzie, ponieważ klasa Bar został już załadowany, a zatem nie wywołuje inherited 2nd czasu. Jeśli asercja nie zostanie uruchomiona jako pierwsza ... nie powiedzie się.

Więc próbowałem coś takiego ...

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 ponieważ nie utrzymują się od testu do badania, badanie nie wystarczy uruchomić tylko raz.

ktoś ma jakieś sprytne sposoby, aby to osiągnąć? Jest to wymyślony przykład i dont faktycznie trzeba przetestować rubin się;)

+0

przetestować zachowanie, a nie realizacja. Testowanie, czy klasa dziedziczy z klasy come, byłoby uzasadnione tylko wtedy, gdy metoda wykonuje meta-programowania (jak konstruowanie klasy i ustawia przodków) –

Odpowiedz

24

Oto prosty sposób na sprawdzenie dla klasy dziedziczenia z RSpec:

Biorąc

class A < B; end 

znacznie prostszy sposób, aby przetestować dziedziczenie z RSpec:

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

Dobra odpowiedź! Wyjaśnienie można znaleźć tutaj: http://ruby-doc.org/core-2.3.0/Module.html#method-- 3C –

0

Dokonaj definicję klasy dla przebiegu badania spadków podczas testu:

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

tak proste ... po prostu użyj innej klasy dla tego pojedynczego testu ... oczywiście! dzięki! – brewster

1

Z jakiegoś powodu, nie zarządzać solution from David Posey do pracy (chyba zrobiłem coś złego. Zapraszam do przedstawienia rozwiązania w komentarzach). W przypadku gdy ktoś tam mają ten sam problem, to działa zbyt:

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

na coś takiego

class Child < Parent; end 

zwykle zrobić:

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