Почему этот тест не будет работать с самоцветом Sucker Punch?

Цель этого кода - отправить электронное письмо пользователю с массивом продуктов, процент скидки которых достиг заданного порогового значения. Продукты возвращаются:

user.notifications

который возвращает массив из 2 массивов элементов в следующем формате:

[[product, notification]]

Уведомление - это объект, состоящий из процента скидки и идентификатора продукта.

send_notification? 

проверяет, было ли пользователю отправлено уведомление в течение последних 7 дней, и возвращает логическое значение (значение true, если они не получили письмо на прошлой неделе, и значение false, если оно имеется для передаваемого продукта).

У меня есть следующая работа и сопутствующий тест:

class ProductNotificationEmailJob
  include SuckerPunch::Job

  def perform(user)
    user_notifications = user.notifications || []
    products = []
    notifications = []
    user_notifications.each do |notification|
      if notification[1].send_notification?
        products << notification[0]
        notifications << notification[1]
      end
    end
    NotificationMailer.notification_email(user, products).deliver

    notifications.each do |notification|
      notification.update(notification_date: Time.now)
    end
  end
end

тестовое задание:

require 'rails_helper'

describe ProductNotificationEmailJob do
  it 'performs' do 
    notification = ObjectCreation.create_notification
    expect(notification.notification_date).to be_nil
    user = notification.user
    stub = double("Object")

    expect(NotificationMailer).to receive(:notification_email).with(user, [notification.my_product.product]).and_return(stub)

    expect(stub).to receive(:deliver)

    ProductNotificationEmailJob.new.perform(user)

    expect(MyProductsNotification.last.notification_date).to_not be_nil
  end
end

Когда я вынимаю строку: include SuckerPunch::Job, тест проходит нормально, но я не могу заставить его пройти с этой строкой. По какой-то причине со строкой include SuckerPunch:: Job кажется, что метод создания объекта не работает и возвращает nil для всех значений. Я заранее прошу прощения, если я не дал достаточно подробностей, но я не хотел размещать слишком много кода. Оставьте комментарий, и я включу любую запрашиваемую информацию. Спасибо за ваше время, я действительно ценю это!

1 ответ

Посмотрев на проблему свежим взглядом, я понял, что нарушаю правила инкапсуляции, даже пытаясь сделать все это в классе ProductNotificationEmailJob. Я извлек в другой класс, и все работает отлично и отлично проверяется.

Другие вопросы по тегам