RSpec 使用 build Factories 而不是 create 时出错 - 预计已更改 1,但已更改 0

RSpec error using build Factories instead of create - expected to have changed by 1, but was changed by 0

我的模型 ActivityRead 属于其他三个模型(详情如下)。我想添加一个 FactoryBot 生成器并尝试检查模型是否有效以及是否可以保存到数据库中。我正在使用 build 调用工厂而不是 create 来保存到数据库,在我的规格中我收到错误:

  1) ActivityRead associations when new model is created save to DB
     Failure/Error: expect { sample_activity }.to change { ActivityRead.count }.by(1)
       expected `ActivityRead.count` to have changed by 1, but was changed by 0

这是我的规格:

context 'when new model is created' do
  let(:sample_activity) { build(:activity_read) }

  it 'save to DB' do
    expect { sample_activity }.to change { ActivityRead.count }.by(1)
  end
end

工厂:

FactoryBot.define do
  factory :activity_read do
    user
    journey
    activity
    cms_activity_id { Faker::Number.number }
  end
end

ActivityRead 型号

class ActivityRead < ApplicationRecord
  belongs_to :user
  belongs_to :journey
  belongs_to :activity
end

奇怪的是,当我使用 let(:sample_activity) { create(:activity_read) } 而不是 let(:sample_activity) { build(:activity_read) } 时,规格会通过。

正如您已经正确发现的那样,

create which saves to db

build 仅构建对象但不将其存储到数据库中。 ActivityRead.count 将触发一个 SELECT COUNT(*) from activity_reads 查询,该查询当然是空的。

您需要对对象调用 save 以将其保存到数据库。

context 'when new model is created' do
  let(:sample_activity) { build(:activity_read) }

  it 'save to DB' do
    expect { sample_activity.save }.to change { ActivityRead.count }.by(1)
  end
end