1

此代码的目的是向用户发送一封电子邮件,其中包含折扣百分比已达到给定阈值的产品数组。产品被退回:

user.notifications

它返回具有以下格式的 2 个元素数组的数组:

[[product, notification]]

通知是由折扣百分比和 product_id 组成的对象。

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

当我取出这条线时:包括 SuckerPunch::Job 测试通过了,但我无法让它通过那条线。出于某种原因,包含 SuckerPunch::Job 行似乎对象创建方法不起作用并为所有值返回 nil。如果我没有提供足够的细节,但我不想发布太多代码,我提前道歉。发表评论,我将包括所要求的任何细节。谢谢你的时间,我真的很感激!

4

1 回答 1

0

在以全新的眼光看待问题后,我意识到我什至尝试在 ProductNotificationEmailJob 类中做所有这些事情,从而违反了封装规则。我提取到另一个类,一切运行良好并且完全可以测试。

于 2014-08-02T05:08:42.077 回答