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
时,对象实际上并未保存到数据库中,因此不会触发回调。
我有一个包含多个 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
时,对象实际上并未保存到数据库中,因此不会触发回调。