Ruby on rails FactoryGirl,是否有一个关联和验证失败

Ruby on rails FactoryGirl,是否有一个关联和验证失败,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,以下是两个简单的模型: class Post < ActiveRecord::Base has_one :asset, :dependent => :destroy validates :asset, presence: true end class Asset < ActiveRecord::Base belongs_to :post end 但是,运行规范会进入一个循环 我也尝试过这个: factory :post do # fields...

以下是两个简单的模型:

class Post < ActiveRecord::Base
  has_one :asset, :dependent => :destroy

  validates :asset, presence: true
end

class Asset < ActiveRecord::Base
  belongs_to :post
end
但是,运行规范会进入一个循环

我也尝试过这个:

  factory :post do
    # fields...

    before(:create) do |post, evaluator|
      FactoryGirl.create_list(:asset, 1, post: post)
    end
  end
但结果是“验证失败:资产不能为空”


如何表示我的情况?

您可以按如下方式传递子关联以预加载它:

FactoryGirl.define do
  factory :post do
    asset { Asset.create! }
  end
end
(更好的做法是,使用资产工厂生成预先设置了详细信息的关联资产)

另一种手动方式是通过FactoryGirl.create(:Asset)创建资产,并将其传递到变量创建中,即:

asset = FactoryGirl.create(:asset)
post = FactoryGirl.create(:post, asset: asset)

错误
验证失败:资产不能为空
是因为您的工厂中的关联看起来是反向的

factory :post do
  # fields...
end
因此,当您创建
post
时,没有
资产
,因此验证失败。试试这个

factory :post do
# fields...
  asset
end

看看这个。它还解释了
create
build
之间的区别,关联性验证失败,因为当
FactoryGirl
创建
Post
时,必须存在资产。因此,在您的
FactoryGirl
定义中,您可以创建
Asset
,作为创建
Post
的一部分。插入类似于
FactoryGirl post.rb的文件:

asset { FactoryGirl.create(:asset) }

您可以在spec文件中创建
资产
,作为
Post
声明的一部分,例如:

asset = FactoryGirl.create(:asset)

FactoryGirl.create(:post, :asset => asset)

谢谢。

我使用after(:build)回调解决了这个问题

factory :post do
    # fields...
    after(:build) do |post|
      post.asset ||= FactoryGirl.build(:asset, :post => post)
    end
end

factory :asset do
    # fields...
    after(:build) do |asset|
      asset.post ||= FactoryGirl.build(:post, :asset => asset)
    end
end

通过这种方式,关联对象将在保存所属类之前创建,因此验证将通过。

您是否有任何理由在
:asset
上设置
post
?似乎很奇怪,因为在创建过程中,
Post
是需要
Asset
的。Factory的关联表示外键,而不是has\u one/has\u many关联。我错了吗?我试过那个解决方案,但没有成功。我认为这会产生一个循环。你自己试过吗?无论如何谢谢谢谢,但是您的解决方案是否使用我在资产工厂中定义的相同字段创建资产?如果您希望它使用在资产工厂中定义的相同字段创建资产:
asset{FactoryGirl.create(:asset)}
请查看上面的上次更新。。。我仍然遇到错误您的资产工厂是否创建后期模型?如果是这样的话,你将进入一个无限循环。谢谢。我已经更新了第一篇帖子。但我还是有麻烦。您能帮助我吗?其他回调包括(:create)
之后的
和(:stub)
之后的
在@MichDart中提到过,我看不出这是有效的。我在构建回调中分配了它,在创建回调之前打印。对象不在那个里。更新了吗?@7H3IN5ID3R,首先我无法让它正常工作。。。检查您的验证是否没有在末尾包含
\u id
。例如,
验证:资产,状态:真
而不是
验证:资产_id,状态:真
factory :post do
    # fields...
    after(:build) do |post|
      post.asset ||= FactoryGirl.build(:asset, :post => post)
    end
end

factory :asset do
    # fields...
    after(:build) do |asset|
      asset.post ||= FactoryGirl.build(:post, :asset => asset)
    end
end