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
我的模型 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