【问题标题】:FactoryBot Undefined Method ErrorFactoryBot 未定义方法错误
【发布时间】:2021-06-11 08:57:50
【问题描述】:

我有一个现有的工厂(订单),我正在尝试创建一个有效地继承它的新工厂。它看起来像这样:

factory :order_with_domain, :parent => :order do |o|
  o.order_provider 'DomainNameHere'
end

在这样做并使用order_with_domain 运行规范后,我受到了以下欢迎:

undefined method `order_provider=' for #<Order:0x00007fc70d9fafc0> 
Did you mean?  order_provider

如果我尝试将 order_provider 放在父工厂中,我会收到同样的错误。

非常感谢任何帮助。

谢谢。

【问题讨论】:

  • 您的 Order 模型是否有 order_provider 属性?
  • 如果没有,它会不会提供一个通用的undefined method 错误而不是告诉我尝试order_provider?从控制台,我可以拨打order.order_provider 并获得我需要的东西。
  • 好的,看来您可能有一个 getter (order_provider) 但没有一个 setter (order_provider=)。请编辑您的问题以显示您的订单模型的代码。
  • @IainK 它确实给了你一个通用的NoMethodError 恰好did_you_mean 找到了一个类似的方法名称并提供了一个建议。就像"S".chimp问我是说chomp还是chomp!
  • 几乎可以肯定你还没有定义#order_provider=(这是与#order_provider不同的方法)。

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


【解决方案1】:

尝试运行rails c test,然后检查您的列是否存在。如果不是,那么这是您的测试数据库的问题,您需要使用 RAILS_ENV=test rake db:migrate 在测试环境中运行迁移。如果没有任何反应,请删除您的 schema.rb,然后再次运行迁移命令。

【讨论】:

    【解决方案2】:

    尝试将值放在花括号中,如下所示:

    factory :order_with_domain, :parent => :order do |o|
      o.order_provider { 'DomainNameHere' }
    end
    

    这是on thoughtbot的原因

    【讨论】:

      【解决方案3】:

      假设您的模型具有order_provider 属性或order_provider= 方法,正如@moveson 上面评论的那样。

      我会使用traits。像这样的:

      factory :order do
        # ... original factory stuff
      
        trait :with_domain do
          order_provider 'DomainNameHere'
        end
      end
      

      然后使用它:

      order_with_domain = FactoryBot.create(:order, :with_domain)
      

      【讨论】:

      • 我同意这是一个很好的 trait 用例,但如果没有 Order#order_provider= 的方法,它就不会起作用。
      • 没有order_provider= 方法。查看 OP 的错误信息。
      • 这当然是可能的,但如果order_provider 不是模型上的属性则不常见。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多