如何用RSpec和FactoryGirl在Rails模型中测试BEFORE_UPDATE回调? [英] How to test before_update callback in rails model with Rspec and FactoryGirl?

查看:0
本文介绍了如何用RSpec和FactoryGirl在Rails模型中测试BEFORE_UPDATE回调?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试测试下面模型的BEFORE_UPDATE回调。

型号/option.rb:

class Option < ApplicationRecord
  belongs_to :activity

  has_many :suboptions, class_name: "Option", foreign_key: "option_id"

  belongs_to :parent, class_name: "Option", optional: true, foreign_key: "option_id"

  accepts_nested_attributes_for :suboptions, allow_destroy: true,
    reject_if: ->(attrs) { attrs['name'].blank? }

  validates :name, presence: true

  before_create :set_defaults
  before_update :set_updates


  def set_defaults
    self.suboptions.each do |sbp|
      sbp.activity_id = self.activity_id
    end
  end

  def set_updates
    suboptions.each do |child|
      child.activity_id = self.activity_id
    end
  end
end

规范/型号/option.rb:

require 'rails_helper'

RSpec.describe Option, type: :model do

  describe "Callbacks" do
    it "before_create" do
      suboption = create(:option)
      option = create(:option, suboptions:[suboption])
      option.run_callbacks(:create) {false}
      expect(option.suboptions.first.activity_id).to eq suboption.activity_id
    end

    it "before_update" do

    end
  end



end

我成功地测试了BEFORE_CREATE回调(至少它给出了正确的结果)。但是我不知道如何测试BEFORE_UPDATE回调。有办法做到这一点吗?

推荐答案

警告:此答案正确无误。

测试行为,而不是实现。

回调是实现细节。不要直接测试它。相反,请假装您不知道模型在内部如何工作,并测试它的行为。

如果我没有读错代码,可以这样描述该行为:

更新选项时,其每个子选项的active_id 设置为选项的active_id。

创建一个包含子选项的选项。更新它,重新加载它,并检查每个active_id的值是否正确。

这将比模仿慢,但不那么脆弱。此外,该测试更易于编写和维护。

这篇关于如何用RSpec和FactoryGirl在Rails模型中测试BEFORE_UPDATE回调?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆