工厂机器人创建不正确的数据

Posted

技术标签:

【中文标题】工厂机器人创建不正确的数据【英文标题】:Factory bot creates incorrect data 【发布时间】:2021-12-16 23:50:00 【问题描述】:

为什么这个测试通过了?我不明白问题出在哪里:Factory bot 还是 Rails?

型号:

class Vote < ApplicationRecord
  belongs_to :user
  belongs_to :votable, polymorphic: true

  validate :self_like

  private

  def self_like
    errors.add(:user, 'self-like') if votable.author_id == user_id
  end
end

工厂:

FactoryBot.define do
  factory :vote do
    value  1 
    user
    association :votable, factory: :question
  end
end

如果你输出被测试的对象(pp 投票),那么所有的属性都将为 nil。在这种情况下,可以获得关联对象(pp vote.votable)

describe 'validate :self_like' do
  let!(:vote)  build :vote 

  it "self-like" do
    vote.valid?

    expect(vote.errors[:user]).to include('self-like')
  end
end

【问题讨论】:

votable.author_id 和 user_id 是否为零? 【参考方案1】:

工厂的定义方式没有指定投票作者和用户匹配,所以votable.author_id == user_id 将是错误的。

我能想到的最佳解决方案是使用 after_build 挂钩更新可投票作者并强制它与用户匹配。

after(:build) do |vote|
  vote.votable.update!(author: vote.user)
end

【讨论】:

以上是关于工厂机器人创建不正确的数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Node.js 中使用 Skype-sdk 构建的 Skype 机器人运行不正确?

道路游戏

P1070 道路游戏

P1070 道路游戏

P1070 道路游戏

Luogu P1070 道路游戏