我有一个Reminder
模型需要在创建时计算一个重要的数据。我为此目的使用before_create
回调:
class Reminder < ActiveRecord::Base
validates :next_send_time, presence: true
before_create :set_next_send_time
def set_next_send_time
self.next_send_time = calc_next_send_time
end
end
问题是,回调似乎没有在我的控制器规范中运行。该属性对于模型至关重要,在我的应用程序的其他测试中,我希望它可以在create
上计算。
reminders_controller#create
方法
def create
respond_with Reminder.create(reminder_params)
end
这里是reminders_controller_spec
:
RSpec.describe Api::RemindersController do
describe 'create' do
it "should work" do
post :create,
reminder: {
action: 'Call mom',
frequency: 1,
type: 'WeeklyReminder',
day_of_week: 0,
start_date: Date.new,
time_of_day: '07:00:00',
user_id: 1
},
format: :json
reminders = Reminder.all
expect(reminders.length).to eq(1)
end
end
end
如果我检查响应,则错误是next_send_time
为空。
如何让Reminder的回调在我的Rspec测试中运行?
答案 0 :(得分:2)
而不是before_create
,请尝试before_validation :set_next_time, on: :create
。
如果记录未通过验证,则不会触发回调。
编辑:将方法名称更正为before_validation
。
答案 1 :(得分:0)
如果您使用的是Rails 4.0,则可以使用[TestAfterCommit][1]
gem。
如果您使用的是Rails 5.0,则内置于:https://github.com/rails/rails/pull/18458