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