Почему этот тест не будет работать с самоцветом 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. Я извлек в другой класс, и все работает отлично и отлично проверяется.