FactoryGirl创建具有错误属性的实例



免责声明:由于安全问题而更改了模型名称和属性!

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的一个示例,如果验证器正确选择了测试,您的测试将通过,而不是失败。

很抱歉,如果我误解了您的问题。

最新更新