【问题标题】:FactoryGirl not giving useful validation errorsFactoryGirl 没有给出有用的验证错误
【发布时间】:2012-03-22 15:32:30
【问题描述】:

我将 FactoryGirl 用于我的固定装置,但我发现它并没有真正产生有用的验证错误。

我总是收到有关 activerecord.errors.models.messages.record_invalid 的消息。

不确定需要哪些进一步的详细信息来帮助诊断。这使得跟踪每个错误的过程非常缓慢。

示例工厂:

Factory.define :partner do |partner|
  partner.sequence(:username){ |n| "amcconnon#{n}" }
  partner.first_name            "Bobby Joe"
  partner.last_name             "Smiley"
  partner.sequence(:email){ |n| "bob{n}@partners.com" }
  partner.phone_number          "5557 5554"
  partner.country_id            75
  partner.password              "password"
  partner.password_confirmation "password"
end

Then Factory(:partner) => "ActiveRecord::RecordInvalid Exception: 看起来这些更改出了点问题"

实际的问题当然是电子邮件序列没有正确使用 n 并且电子邮件有唯一的验证。但这是为了说明目的。

导轨 => 3.2.2 factory_girl 2.6.1

是否需要任何其他的 deets 来帮助诊断?

(注意:编辑这个只是为了添加一个更容易阅读的工厂)

编辑:

根据 bijan 的评论:“我到底想做什么。”

尝试运行“rspec 规范”。我想当我在这种情况下使用像 Factory(:partner) 这样的工厂来获取错误消息时,它不能包含我从 Partner.new({blah...}).valid 得到的相同错误?然后查看验证失败。

【问题讨论】:

  • 你到底想做什么?您只需调用 partner.errors 或 .message 就单个错误来找出问题所在。
  • 那么您是否尝试通过更改工厂定义来测试验证,故意包含未通过验证的属性?还是我误会了?
  • 问题在于,当我们更改或验证时,工厂出现故障,故障发生的位置可能非常模糊。

标签: ruby-on-rails rspec factory-bot


【解决方案1】:

我不确定这是否与您遇到的完全相同的问题,但这是我遇到的问题,验证错误消息不是很有用,我认为它可能对其他搜索此问题的人有用。下面是我想出的。这也可以修改以提供不同的信息。

include FactoryGirl::Syntax::Methods

# Right after you include Factory Girl's syntax methods, do this:

def create_with_info(*args, &block)
  create_without_info(*args, &block)
rescue => e
  raise unless e.is_a? ActiveRecord::RecordInvalid
  raise $!, "#{e.message} (Class #{e.record.class.name})", $!.backtrace
end
alias_method_chain :create, :info

然后,当您使用create :model_name 时,它总是会在错误消息中包含型号名称。我们有一些相当深的依赖关系(是的,另一个问题),并且有一个验证错误,例如“名称无效”......并且name 是几个不同模型的属性。添加此方法后,可以节省大量调试时间。

【讨论】:

    【解决方案2】:

    我认为这里的关键点是,当您设置测试时,您需要确保您测试的代码在您设置期望时失败(即当您在 Rspec 中说“应该”时) )。测试验证的具体问题当然是,一旦您尝试保存 ActiveRecord 对象,验证就会失败。因此测试设置不能调用保存。

    具体建议:

    1) IMO 工厂定义应包含创建有效对象所需的最少信息,并且应尽可能少地更改。当您想测试验证时,您可以在实例化新测试对象时覆盖正在测试的特定属性。

    2) 测试验证时,使用Factory.buildFactory.build 创建具有指定属性的 ActiveRecord 实例但不尝试保存它;这意味着您可以推迟触发验证,直到您在测试中设置期望。

    这样的事情怎么样?

    it "should fail to validate a crap password" do
      partner_with_crap_password = Factory.build(:partner, :password => "crap password")
      partner_with_crap_password.should_not be_valid
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2010-11-21
      相关资源
      最近更新 更多