2016-10-20 5 views
0

diesen Code-Schnipsel vor:Wie man diese Schienenspezifikation umgestaltet?

context 'votes' do 
    it { should_not be_able_to :vote_yes, create(:question, user: user), user: user } 
    it { should be_able_to :vote_yes, create(:question, user: other_user), user: user } 
    it { should_not be_able_to :vote_no, create(:question, user: user), user: user } 
    it { should be_able_to :vote_no, create(:question, user: other_user), user: user } 
    it { should_not be_able_to :reject_vote, create(:question, user: user), user: user } 
    it { should be_able_to :reject_vote, create(:question, user: other_user), user: user } 

    it { should_not be_able_to :vote_yes, create(:answer, user: user), user: user } 
    it { should be_able_to :vote_yes, create(:answer, user: other_user), user: user } 
    it { should_not be_able_to :vote_no, create(:answer, user: user), user: user } 
    it { should be_able_to :vote_no, create(:answer, user: other_user), user: user } 
    it { should_not be_able_to :reject_vote, create(:answer, user: user), user: user } 
    it { should be_able_to :reject_vote, create(:answer, user: other_user), user: user } 
end 

Wie in etwas mit weniger Linien und Vervielfältigungen Refactoring?

Antwort

2

Das erste, was ich tun würde, Ihre Tests in mehr logischen Gruppierungen aufgeteilt wird, wie es derzeit sehr verwirrend ist (auf einem Blick), was das erwartete Verhalten ist:

context 'voting yes' do 
    it { should be_able_to :vote_yes, create(:answer, user: other_user), user: user } 
    it { should_not be_able_to :vote_yes, create(:question, user: user), user: user } 

    it { should be_able_to :vote_yes, create(:question, user: other_user), user: user } 
    it { should_not be_able_to :vote_yes, create(:answer, user: user), user: user } 
end 

context 'voting no' do 
    it { should be_able_to :vote_no, create(:question, user: other_user), user: user } 
    it { should_not be_able_to :vote_no, create(:question, user: user), user: user } 

    it { should be_able_to :vote_no, create(:answer, user: other_user), user: user } 
    it { should_not be_able_to :vote_no, create(:answer, user: user), user: user } 
end 

context 'rejecting vote' do 
    it { should be_able_to :reject_vote, create(:question, user: other_user), user: user } 
    it { should_not be_able_to :reject_vote, create(:question, user: user), user: user } 

    it { should be_able_to :reject_vote, create(:answer, user: other_user), user: user } 
    it { should_not be_able_to :reject_vote, create(:answer, user: user), user: user } 
end 

in dieser neu strukturiert Liste der Tests Suche Es ist viel einfacher, ein klares Verhaltensmuster zu sehen. Sie könnten die Wiederholung wie folgt entfernen:

%i(vote_yes vote_no reject_vote).each do |action_performed| 
    context "can #{action_performed} against other users" do 
    it { should be_able_to action_performed, create(:question, user: other_user), user: user } 
    it { should be_able_to action_performed, create(:answer, user: other_user), user: user } 
    end 

    context "cannot #{action_performed} against self" do 
    it { should_not be_able_to action_performed, create(:question, user: user), user: user } 
    it { should_not be_able_to action_performed, create(:answer, user: user), user: user } 
    end 
end 

Sie können sogar noch weiter noch einen Schritt zu nehmen versucht sein, Überschneidungen zwischen question und answer Tests zu entfernen:

%i(vote_yes vote_no reject_vote).each do |action_performed| 
    %i(question answer).each do |record_type| 
    it "can #{action_performed} against #{record_type} for other users" do 
     should be_able_to action_performed, create(record_type, user: other_user), user: user 
    end 

    it "cannot #{action_performed} against #{record_type} for self" do 
     should_not be_able_to action_performed, create(record_type, user: user), user: user 
    end 
    end 
end 

Dies macht jedoch wahrscheinlich die Tests härter zu verstehen und zu bearbeiten, so würde ich davon abraten ... Vielleicht, wenn diese Liste der Datensatztypen (question, answer, ...) viel länger wächst, dann könnte man einen Ansatz wie folgt betrachten.

+0

Auch für zukünftige Referenz eignen sich solche Fragen besser für die [code review] (http://codereview.stackexchange.com/) StackExchange-Website. –

Verwandte Themen