在rspec中运行回调

时间:2014-12-30 14:27:57

标签: ruby-on-rails rspec

我有一个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测试中运行?

2 个答案:

答案 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