我有一个带有许多before_save回调的用户模型 - 例如,一个剥离前导和尾随空格的模型:
应用程序/模型/ 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
我有一个基本的型号规格,我想检查一下这确实有效。例如,“内森”应该返回“内森”
规格/型号/ 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
但是,当我运行测试时,此期望失败。我检查了邮递员(这是一个API),回调正确运行,并正确设置用户的属性。
关于为什么会发生这种情况的任何帮助,或者,如何重组我的测试以反映Rspec / Factory Bot实际上如何工作。
像这样将build
改为create
:
let(:user) { create :poorly_defined_user }
调用build
时,该对象实际上并未保存到db中,因此回调不会触发。