Ruby 如何重构rails规范?
考虑以下代码片段:Ruby 如何重构rails规范?,ruby,rspec,refactoring,Ruby,Rspec,Refactoring,考虑以下代码片段: 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(:ques
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
如何重构成具有较少行数和重复的内容?我要做的第一件事是将您的测试分成更多的逻辑分组,因为目前很难(一目了然)了解预期的行为是什么:
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
看看这个重组后的测试列表,更容易看到清晰的行为模式。您可以按如下方式删除重复:
%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
您甚至可能会更进一步,以消除问题
和答案
测试之间的重复:
%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
然而,这可能使测试更难理解和编辑,所以我建议不要这样做。。。也许如果记录类型的列表(<代码>问题>代码>,<代码>回答< /代码>,<代码>…>代码>)长得多,那么你可以考虑这样的方法。 < p>我首先要做的就是把你的测试分成更逻辑的分组,因为现在很困惑(一目了然)所期望的行为是:
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
看看这个重组后的测试列表,更容易看到清晰的行为模式。您可以按如下方式删除重复:
%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
您甚至可能会更进一步,以消除问题
和答案
测试之间的重复:
%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
然而,这可能使测试更难理解和编辑,所以我建议不要这样做。。。也许如果记录类型的列表(<代码>问题>代码>,<代码>回答< /代码>,<代码>…>代码>)长得多,那么你可以考虑这样的方法。也为将来的参考,这样的问题更适合STACKExchange站点。这样的问题更适合StackExchange站点。