2016-06-30 14 views
0

In einem RSPECT-Test möchte ich gemeinsame Tests für zwei verschiedene Klassen implementieren, um eine Wiederholung zu vermeiden. Die Tests werden an den Objekten foo und bar durchgeführt. Mein Test hat die folgende Struktur:Iterieren über Objekte in einem RSPEX-Testfall

let(:foo) { create(:foo) } 
let(:bar) { create(:bar) } 

FOOBAR = { 
    "foo" => foo, 
    "bar" => bar 
} 

describe 'POST :id/foobar_type/:foobar_id/do' do 
    FOOBAR.each do |foobar_type, foobar| 
    it 'creates something on an foobar' do 
    end 

    it 'raises an error if unauthorized' do 
    end 

    ... 
    end 
end 

Dies funktioniert nicht wie erwartet, da foo und bar bei der Deklaration von FOOBAR nicht verfügbar sind. Sie sind nur während eines it Blocks gültig. Wie kann ich ein solches Testmuster implementieren?

+1

Haben Sie versucht, das gemeinsame Verhalten Funktionalität in Rspec verwenden? – MageeWorld

Antwort

1

Sie sollten sich ansehen.

Für die etwas abstraktes Beispiel Sie haben:

RSpec.shared_examples 'good foobar' do |foobar| 
    it 'creates something on a foobar' do 
    end 

    it 'raises an error if unauthorized' do 
    end 
    ... 
end 

Sie dann auf den freigegebenen Beispiel so nennen kann.

describe 'POST :id/foobar_type/:foobar_id/do' do 
    it behaves_like 'a good foobar' foo 
    it behaves_like 'a good foobar' bar 
end 
0

Wenn Sie sind in der Lage FOOBAR eine nicht konstante dann machen Sie es wie

let(:foobar) { 'foo' => foo, 'bar' => bar } 

Oder definieren kann, wenn man es als konstant halten wollen (was ich Sie nicht denken sollte, weil es auf den Werten der foo und bar abhängt, und sie sind nicht konstant)

before do 
    FOOBAR = { 'foo' => foo, 'bar' => bar } 
end