使用 `shoulda-callback-matchers` 测试 after_create_commit 回调 gem + rails 5 + rspec

Test after_create_commit callback using `shoulda-callback-matchers` gem + rails 5 + rspec

我正在使用 shoulda-callback-matchers gem 来测试回调。 Rails 版本为 5.2.2,RSpec 版本为 3.8.0。

有人知道如何使用 shoulda-callback-matchers gem 测试 after_create_commit 回调吗?

它适用于 after_createafter_update

型号代码

after_create :admission_created_notification
after_update :admission_status_change_notification

示例

context "callbacks" do
 let(:admission) { create(:admission) }
   it { expect(admission).to callback(:admission_created_notification).after(:create) }
   it { expect(admission).to callback(:admission_status_change_notification).after(:update) }
end

像这样:

RSpec.describe YourModel, type: :model do
  context 'callbacks check' do
    it { is_expected.to callback(:admission_created_notification).after(:create) }
    it { is_expected.to callback(:admission_status_change_notification).after(:update) }
  end
end

我没有使用上面提到的gem。这些回调我使用默认的Rspec方式来写rspec。 模型回调代码

class Admission < ApplicationRecord
  after_create_commit :admission_created_notification
  after_update_commit :admission_status_change_notification
end

型号规格代码

context 'create and update' do
    let(:student_detail) { FactoryBot.create(:student_detail) }
    let(:institute_program) { FactoryBot.create(:institute_program) }
    let(:admission) { FactoryBot.create(:admission, student_detail: student_detail, institute_program: institute_program) }
    it 'When create' do
      admission.student_detail.notifications.count(1)
      admission.institute_program.institute_detail.notifications.count(1)
    end
    it 'When applied' do
      admission.update(status: 'applied')
      admission.student_detail.notifications.count(2)
      admission.institute_program.institute_detail.notifications.count(2)
    end
    it 'When accepted' do
      admission.update(status: 'accepted')
      admission.student_detail.notifications.count(3)
      admission.institute_program.institute_detail.notifications.count(3)
    end
    it 'When rejected' do
      admission.update(status: 'rejected')
      admission.student_detail.notifications.count(3)
    end
    it 'When approved' do
      admission.update(status: 'approved')
      admission.student_detail.notifications.count(4)
      admission.institute_program.institute_detail.notifications.count(4)
      admission.notifications.count(9)
    end
  end