2017-04-13 2 views
0

Ich baue einen sehr grundlegenden Test, um zu überprüfen, ob ein Objekt in einer Beziehung erstellt wird. Website has_many languages. Ich habe die Methode , die ein Array von IDs erhält und fügt sie hinzu.Elegante Möglichkeit zu testen, dass neue Objekte erstellt werden

Dies ist einige meiner Tests:

describe '#add_languages' do 
    subject{ build(:website) } 

    it 'return nil if no language is added' do 
     expect(subject.add_languages []).to be_nil 
    end 
    it 'adds one single language' do 
     languages_ids = [Language.last.id] 
     original_count = subject.languages.count 
     subject.add_languages languages_ids 
     expect(subject.languages.count).to eq(original_count + languages_ids.count) 
    end 
    it 'adds multiple languages' do 
     languages_ids = Language.limit(3).pluck :id 
     original_count = subject.languages.count 
     subject.add_languages languages_ids 
     expect(subject.languages.count).to eq(original_count + languages_ids.count) 
    end 
end 

Was Ich mag es nicht

1) Der Code 2) Ich mag es nicht eq für diese Verwendung dupliziert, aber nicht sicher, wie andere Matcher zu verwenden

Was wäre eine elegante Möglichkeit, diese Tests zu schreiben?

+0

Können Sie einfach eine Funktion innerhalb der Beschreibung definieren, die ein Array von Sprach-IDs empfängt? Auf diese Weise können Sie den Code wiederverwenden, indem Sie einfach die Funktion aufrufen. Ich bin mir zu 99% sicher, dass Ruby und ROR dich dazu bringen werden. – corvuszero

Antwort

0

Zwei schnelle Möglichkeiten, wie Sie dies tun können: Fügen Sie eine Hilfsmethode hinzu oder fügen Sie eine Schleife hinzu.

Helper-Methode

it "adds on single language" do 
    check_creates_languages([Language.last.id]) 
end 

it "Adds multiple languages" do 
    check_creates_languages(...) 
end 

def check_creates_languages(language_ids) 
    original_count = ... # etc 
end 

Schleife

[1,3].each do |language_count| 
    it "can add #{language_count} language(s)" do 
    original_count = Language.last(language_count).count 
    # etc 
    end 
end 

Auch gibt es nichts falsch mit eq verwenden, das ist, was es ist da. Was möchtest du sonst noch benutzen? Sie könnten auch be verwenden.

https://github.com/rspec/rspec-expectations

0

einfach können Sie tun:

expect{subject.add_languages languages_ids}.to change{Language.count}.by(1) 

Mehr oder weniger (basierend auf Ihren Anwendungsfall).

Verwandte Themen