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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails Rspec / Factory Bot没有调用模型before_save回调相关的知识,希望对你有一定的参考价值。

我有一个带有许多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中,因此回调不会触发。

以上是关于Rails Rspec / Factory Bot没有调用模型before_save回调的主要内容,如果未能解决你的问题,请参考以下文章

ruby Rails Rspec模型使用rspec-rails,shoulda-matcher,shoulda-callbacks和factory_girl_rails测试骨架和备忘单。差不多

ruby Rails Rspec模型使用rspec-rails,shoulda-matcher,shoulda-callbacks和factory_girl_rails测试骨架和备忘单。差不多

ruby Rails Rspec模型使用rspec-rails,shoulda-matcher,shoulda-callbacks和factory_girl_rails测试骨架和备忘单。差不多

使用80percent开发rails程序:gem的了解。

Rails Fixtures 未使用 rspec 加载

rails3, rspec2 ActiveRecord#changes 规格中的错误