我有一个带有许多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
我有一个基本的型号规格,我想检查一下这确实有效。例如,"内森"应该返回" Nathan"
规格/模型/ 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实际如何工作。
答案 0 :(得分:2)
将build
更改为create
,如下所示:
let(:user) { create :poorly_defined_user }
调用build
时,对象实际上并未保存到数据库中,因此回调不会被激活。