免责声明:由于安全问题而更改了模型名称和属性!
class Human < ActiveRecord::Base
...
attr_accessible :ssn
validates :ssn, uniqueness: { scope: ... }
validate :ssn_validator
def ssn_validator
#some regexp for checking
...
end
end
和工厂女孩工厂:
FactoryGirl.define do
factory :human do
ssn '123456789'
end
end
在我的测试中,我测试了我的SSN_Validator,即我创建了一些错误的SSN值的人类实例。
class SisIdentifiableTest < ActiveSupport::TestCase
context 'human ssn' do
should 'be valid' do
assert FactoryGirl.build(:human).valid?
end
should 'be invalid if containing a & symbol' do
assert !FactoryGirl.build(:human, ssn:'12345678&').valid?
end
should 'be invalid if sorter than 9 symbols' do
assert !FactoryGirl.build(:human, ssn:'12345678').valid?
end
end
end
测试结果:
HumanTest
human ssn be valid #pass
human ssn be invalid if containing a & symbol #fail
human ssn be invalid if sorter than 9 symbols #fail
首先,我认为我的 ssn_validator 有些错误。但事实并非如此。
所有人类实例都是有效的,因为SSN有效吗?电话被缓存。
我的意思是有效吗?方法测试人类实例针对默认的" 123456789"有效值(由:人类工厂提供),而不是针对假定的 ssn:'12345678'或 ssn:'12345678&amp&amp;>
在样本中:
human = FactoryGirl.build(:human, ssn:'there be dragons')
human.ssn #'there be dragons'
human.ssn_validator #false - because the sting is not valid
human.valid? #true
我的问题:如何使用FactoryGirl测试验证?还有其他方法是否有效?不反对缓存属性?还是我正在使用错误的方式创建经过测试的实例?
FactoryGirl并不是真正用于测试验证。可以帮助您设置测试数据是一种便利。build
方法不会在模型上引起任何验证,因为它实际上只是在执行Human.new
,然后从工厂设置属性。在您实际尝试保存模型之前,验证不会发生。
(FactoryGirl的create
方法将验证对象与Human.create
相同,因此必须保存对象。它再次设置了从工厂设置属性。)
您是否可以发布SSN_Validator方法的代码?例如,如果验证失败,它是否执行诸如errors.add(:ssn, ...)
之类的操作?valid?
方法需要这是需要的,然后才能意识到已经发生了验证失败。
我阅读您的问题的方式,确实意味着错误在验证器中。当您说:
human ssn be invalid if containing a & symbol #fail
这意味着您对不起作用的验证。这是无效的SSN的一个示例,如果验证器正确选择了测试,您的测试将通过,而不是失败。
很抱歉,如果我误解了您的问题。