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

时间:2014-02-06 12:08:09

标签: ruby-on-rails factory-bot

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

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测试验证?还有其他方法有效吗?工作不反对缓存属性?或者我使用错误的方式创建测试的实例?

1 个答案:

答案 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的例子,如果验证器正确地选择它,你的测试将会通过,而不是失败。

如果我误解了你的问题,请道歉。