测试Apple推送通知

时间:2015-04-29 06:34:14

标签: node.js mongoose coffeescript apple-push-notifications apnagent

我使用node.js(服务器框架)和mongoose.js(基于mongo的架构建模)作为iOS应用程序的后端,我使用Mocha(测试框架)来确保一切正常。

我真正想知道的,并且找不到任何文档,是如何在服务器上测试推送通知是否正确发送。我正在使用apnagent,目前我可以看到通过手动检查我的设备正确发送推送通知,但我很难找到一种自动方式来测试它们是否正常工作。

这可能足以让我们在高层次回答需要做的事情。但如果不是这里是实际的代码:

Mongoose Model在创建时触发推送通知:

#this code is called after this model is saved in mongodb
eventModel.post 'save', (doc) ->
  #push the message
  sendMessageToDevice = (event, token) ->
    message =
      event_body:
        eventId: event._id
        lat: event.lngLat[1]
        lng: event.lngLat[0]
    agent.createMessage()
      .device(token)
      .alert('New Event! ' + event.description)
      .set(message)
      .send()

  #cycle through the users to push to
  #get all the unique device tokens in the database for APN
  users.getAllUniqueDeviceTokens (error, devices) ->
    if error then return util.handleError error
    console.log "Sending push notices to all devices (%d):", devices.length
    console.log devices
    for token in devices
      sendMessageToDevice doc, token

    #send some verification here that the code ran correctly???

然后在我的Mocha测试文件中,我有:

it 'should receive push notification from fort creation', (done) ->
    #some logic here to verify that push notifications were sent
    done()

3 个答案:

答案 0 :(得分:3)

在许多情况下,在编写测试时,要么确认某个操作确实发生了(或者已经发送了推送通知)要么是不可能的,要么就是太危险了。想象一下,为rm命令编写单元测试,以确保执行rm -rf /成功。显然,你不能让这个动作发生并验证你的根分区确实是空的!

然而,您可以做的事情(而且应该做的事情)是验证正确调用完成任务所需的任何命令,例程或其他操作,而不实际允许它们发生。

在您的特定情况下,您无需验证是否已提供推送通知,因为您的应用程序不对通知的递送负责。但是,您可以测试推送通知是否正确传递到推送服务器。

因此,您无需测试成功交付,而是进行测试

  1. 传出请求是否格式正确(即JSON有效)
  2. 是否包含您希望包含的数据(即JSON中的字段存在且包含预期数据)
  3. 是否包含服务器所需的身份验证令牌
  4. 目标服务器是否正确(即您确实将数据发送到xxx.apple.com而不是localhost)
  5. 理想情况下,这些测试请求甚至不会到达目标服务器 - 这样做意味着您依赖于两个并非总是非常稳定的因素:

    • 网络连接
    • 目标服务器可用性和正常功能

    在过去,我处理了这个问题,以便我首先手动发出正确的请求,捕获响应然后在单元测试中模拟整个通信(使用ie nock。这样,我完全在控制整个沟通。

答案 1 :(得分:2)

据我所知,无法检查APNS请求是否已到达目的地。 Apple倾向于拥有这个"一切都很好,如果不是,那么它应该是你的错误"与我们开发商的政策。如果自我开始编码以来事情没有改变,你可以通过2195端口发送原始数据(JSON有效载荷,你可能知道整个格式)来发出APNS请求,你完全没有回应。

只有我能想到的,如果你有一个物理iOS设备(iPod,iPhone或iPad),你可以自动化#34;通过启动带有硬编码令牌的PUSH请求进行测试,该请求对应于您的设备和测试应用,如果您收到通知,则可以正常运行。

哦,如果它不起作用,如果您在防火墙后面操作,请确保打开所有必需的端口。这是我第一次参加此活动时遇到的第一块大石头;)(相关:https://support.apple.com/en-us/HT203609

答案 2 :(得分:1)

我会使用像nock这样的请求模拟框架拦截对APN的请求。网址似乎位于代码here