免责声明:由于安全问题,模型名称和属性已更改!
class Human < ActiveRecord::Base
...
attr_accessible :ssn
validates :ssn, uniqueness: { scope: ... }
validate :ssn_validator
def ssn_validator
#some regexp for checking
...
end
end
FactoryGirl工厂:
FactoryGirl.define do
factory :human do
ssn '123456789'
end
end
在我的测试中,我测试了我的ssn_validator,即我使用错误的ssn值创建了一些Human实例。
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;'
在样本中:
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测试验证?还有其他方法有效吗?工作不反对缓存属性?或者我使用错误的方式创建测试的实例?
答案 0 :(得分:0)
FactoryGirl并非真正用于测试验证。它可以帮助您设置测试数据。 build
方法不会对模型进行任何验证,因为它实际上只是在执行Human.new
,然后从工厂设置属性。在您真正尝试保存模型之前,验证不会发生。
(FactoryGirl的create
方法会验证对象,因为它与Human.create
相同,因此必须保存对象。再次设置工厂的属性。)
您是否可以发布ssn_validator方法的代码?例如,如果验证失败,它是否会执行errors.add(:ssn, ...)
之类的操作? valid?
方法需要这样才能意识到验证失败。
我阅读你的问题的方式,它确实意味着错误在验证器中。当你说:
human ssn be invalid if containing a & symbol #fail
这意味着您的验证不起作用。这是一个无效的ssn的例子,如果验证器正确地选择它,你的测试将会通过,而不是失败。
如果我误解了你的问题,请道歉。