我有一个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,))
多个用户。我还尝试了许多其他变体,最终没有跳过回调(例如在用户工厂中创建公司)。
我希望有人知道如何以与这种类型的控制器设置兼容的方式建造工厂,或者我是否应该以不同的方式构建没有嵌套属性的控制器?
提前感谢您的帮助!
答案 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
这样,您创建的所有用户都将与同一家公司相关联。