2016-03-28 50 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) 

既然你指派,你需要一个=插值到字段名。该foo=方法需要一个参数,它传递的持续参数send方法名称后:

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

一个需要注意的是,由于send结束调用从接收机中的请求的方法,你可能最终绕过protectedprivate方法。

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