【问题标题】: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 是否为零?

标签: ruby-on-rails rspec


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多