2016-03-28 3 views
0

私はバリデーションをテストする簡単な方法が必要です。テストの焦点は検証ではなく統合です。私はTDDで作業していません。それは言われて、私は交換したい:Rspecのテストバリデーションのための短い方法

# Estate model specs 

describe "#name" do 
    it "is required" do 
    estate.name = nil 
    estate.valid? 
    expect(estate.errors).to have_key(:name) 
    end 
end 

describe "#company" do 
    it "is required" do 
    estate.company = nil 
    estate.valid? 
    expect(estate.errors).to have_key(:company) 
    end 
end 

# and so on.. 

をいくつかのように:

# Estate model specs 

requiredFields = [:name, :company, :price, :region, :regions, :typologies, :image] 
requiredFields.each do |requiredField| 
    describe "##{requiredField}" do 
    it "is required" do 
     estate[requiredField] = nil 
     estate.valid? 
     expect(estate.errors).to have_key(requiredField) 
    end 
    end 
end 

フィールド名と価格の作品、問題が団体である:

Estate 
    is an instance of Estate 
    validations 
    with required fields 
     should be valid 
    #name 
     is required 
    #company 
     is required (FAILED - 1) 
    #price 
     is required 
    #region 
     is required (FAILED - 2) 
    ... 

私はと思います問題はestate[requiredField]です。私がcompany_idに変更すると動作します。 foreachでestate.requiredFieldのようなことをするにはどうすればいいですか?

答えて

2

あなたは、受信機の方法として、その引数を呼び出すRubyのsend方法を、使用してestate.requiredFieldを実行することができます。

estate.send(requiredField) 

あなたが割り当てているので、あなたはフィールド名に=を補間する必要があります。 sendは、受信機の中から要求されたメソッドを呼び出して終了するので、あなたは終わるかもしれないということです注意すべき

estate.send("#{requiredField}=", nil)` 

何か:foo=メソッドは、メソッド名の後sendに続けて引数として渡す引数を取ります(protectedまたはprivateの方法を迂回する)。

class Dog 
    private 
    def bark 
    puts 'Woof' 
    end 
end 

Dog.new.bark 
# NoMethodError: private method 'bark' called for #<Dog:0x007fd28bad7590> 

Dog.new.send :bark 
# Woof 
1

object.send

estate.send("#{requiredField}=", value) # setter, estate.requiredField=value 
estate.send(requiredField) # getter, estate.requiredField 

それともテスト

のような種類のため https://github.com/thoughtbot/shoulda-matchersを使用を使用してみてください
関連する問題