Rails Rspec / Factory Bot没有调用before_save回调模型

时间:2017-12-22 20:06:21

标签: ruby-on-rails rspec callback factory-bot

我有一个带有许多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实际如何工作。

1 个答案:

答案 0 :(得分:2)

build更改为create,如下所示:

let(:user) { create :poorly_defined_user }

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