具有嵌套属性的工厂女孩​​错误& Rails 5

时间:2017-04-14 15:49:03

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

我有一个Company模型has_many Users belongs_to Company。我还在Company模型中进行了回调,该回调调用了我想避免的外部服务。我试图用linter设置FactoryGirl,但它一直在抛出错误。

以下是控制器的外观:

class CompanyController < ApplicationController
  ...

  def new
    @company = Company.new
    @user = @company.users.build
  end

  def create
    @company = Company.new(company_params)
    @user = @company.users.first
    ...
  end

  ...
end

控制器在localhost和生产中运行良好,因此代码运行没有问题 - 这是我遇到的测试问题。

我正试图沿着这些方向创建一个工厂:

FactoryGirl.define do
  factory :company do
    name Faker::Company.name
    association :user, strategy: :build
    before(:create) do |company|
      company.class.skip_callback(:create, :before, :my_callback)
    end
  end

  factory :user do
    email Faker::Internet.email
    password "password"
    password_confirmation "password
  end
end

问题是我收到一条错误消息,表示自company must exist以来需要为belongs_to用户提供undefined method user=,并且因为我正在尝试构建?,因此公司说错误query = c.execute(""" SELECT DRDESC FROM Drinks WHERE DRDRID IN (SELECT DTDRID FROM Detail WHERE INGID = (SELECT INGID FROM Ingredients WHERE INDESC LIKE ?)) """, (usrIngredient,)) 多个用户。我还尝试了许多其他变体,最终没有跳过回调(例如在用户工厂中创建公司)。

我希望有人知道如何以与这种类型的控制器设置兼容的方式建造工厂,或者我是否应该以不同的方式构建没有嵌套属性的控制器?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我只想添加一条评论,但我没有足够的声誉。

您没有显示您的模型和数据库表格,但我认为您的users表格中有company_id字段,Company模型的行{{1} }。

在这种情况下我会如何使用工厂女孩:

用户工厂:

has_many :users

公司工厂:

  factory :user do
    email Faker::Internet.email
    password "password"
    password_confirmation "password"
    company
  end

然后在测试中你要创建多个用户,对吗?

 factory :company do
    name Faker::Company.name
 end

这样,您创建的所有用户都将与同一家公司相关联。