Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何重构rails规范?_Ruby_Rspec_Refactoring - Fatal编程技术网

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站点。