2016-08-16 47 views
1

我仍然掌握了Ruby技能。如何使用更好的Ruby語法來清理此測試

我一直在試圖找出如果我可以幹出了一個RSpec測試驗證碼:

require 'rails_helper' 

RSpec.describe Role, type: :model do 

    describe "has several roles types " do 

     before :each do 
      @roles = Role.all 
     end 

     context "The role types that are valid" do 
      it "includes 'proofreader', 'admin', 'super_admin' " do 
       expect(@roles.any?{|r| r.name == 'proofreader'}).to be_truthy 
       expect(@roles.any?{|r| r.name == 'admin'}).to be_truthy 
       expect(@roles.any?{|r| r.name == 'super_admin'}).to be_truthy 
      end 
     end 

     context "The role types that are not valid " do 
      it "includes 'developer' " do 
       expect(@roles.any?{|r| r.name == 'developer'}).to be_falsy 
      end 
     end 

    end 

end 

我特別要減少那些三行代碼到一個,但它一直困擾我如何檢查一行中三個字符串值的ActiveRecord關係。 任何想法?

+0

你應該使用'被TRUE'而不是' be_truthy'。請看看區別。 –

回答

6

好像你需要使用include匹配:

it "includes 'proofreader', 'admin', 'super_admin' " do 
    expect(@roles.map(&:name)).to include('proofreader', 'admin', 'super_admin') 
end 

此外,您還可以刪除before塊只使用Role.pluck(:name)代替:

let(:roles_names) { Role.pluck(:name) } 
it '...' do 
    expect(roles_names).to include('proofreader', 'admin', 'super_admin') 
end 
+0

並注意'let'是新的'@'。 –

+0

謝謝伊利亞。非常明確的答案,我也會投票贊成'讓'和'採摘'課。非常感激。 – chell