如何用RSpec和FactoryGirl在Rails模型中测试BEFORE_UPDATE回调? [英] How to test before_update callback in rails model with Rspec and FactoryGirl?
本文介绍了如何用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屋!
查看全文