Rails Rspec/Factory 机器人未调用模型 before_save 回调

Rails Rspec/Factory Bot isn't invoking model before_save callbacks

我有一个包含多个 before_save 回调的用户模型 - 例如,一个去除前导和尾随空格的回调:

app/models/user.rb:

def strip_whitespace_in_user_names
  self.first_name.strip!
  self.first_name.gsub!(" ", "")
  self.last_name.strip!
  self.last_name.gsub!(" ", "")
end

我有一个基本的模型规格,我想检查一下它是否真的有效。例如,“Nathan”应该 return "Nathan"

spec/models/user_spec.rb:

RSpec.describe User, type: :model do
  let(:user) { build :poorly_defined_user }
  it "has no leading white space" do
    expect(user.first_name).not_to end_with(" ")
  end
end

这里是 poorly_defined_user 的工厂定义:

require 'faker'
password = Faker::Internet.password
# Factory to define a user
FactoryBot.define do
  factory :poorly_defined_user, class: User do
    first_name "     asd  "
    last_name "AS DF  "
    handle "BLASDF824"
    email Faker::Internet.email
    password password
    password_confirmation password
  end
end

然而,当我运行 测试时,这个期望失败了。我检查了 postman(这是一个 API),回调正确 运行,并且用户的属性设置正确。

任何关于为什么会发生这种情况的帮助,或者如何重组我的测试以反映 Rspec/Factory Bot 实际工作方式的任何帮助。

build 更改为 create,如下所示:

let(:user) { create :poorly_defined_user }

调用 build 时,对象实际上并未保存到数据库中,因此不会触发回调。