苹果推送通知测试

5
我正在使用node.js(服务器框架)和mongoose.js(基于mongo的模式建模)作为iOS应用程序后端,并使用Mocha(测试框架)确保一切正常。我真正想知道的是,在服务器上如何测试推送通知是否被适当地发送,但我找不到任何文档。我正在使用apnagent,目前可以通过手动检查我的设备看到推送通知正确发送,但我很难找到自动化测试它们工作是否正确的方法。这可能已经足够描述需要做什么。但以防万一,这里是实际代码:MongoDB模型在创建时触发推送通知:
#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()

我会使用一个请求模拟框架,比如nock,来拦截对APN的请求。这些URL似乎在代码中的这里 - undefined
3个回答

3
在许多情况下,在编写测试时,要么不可能要么过于危险来验证是否真的发生了某个操作(例如推送通知已经被传递)。想象一下为rm命令编写单元测试的情况,您希望确保执行rm -rf /成功。显然,您不能让这个操作发生并验证您的根分区确实为空!
但是,您可以(而且应该)验证必要的命令、例程或其他操作是否被正确调用,而不实际允许它们发生。
在您特定的情况下,您不需要验证推送通知已被传递,因为您的应用程序不负责通知的传递。但是,您可以测试推送通知是否正确地传递到推送服务器。
因此,您不是测试成功的交付,而是测试
  1. 确认发送的请求格式是否正确(即JSON格式是否有效)
  2. 确认请求中包含你所期望的数据(即JSON中的字段存在且包含预期数据)
  3. 确认认证令牌已被包含在服务器要求的请求中
  4. 确认目标服务器是否正确(即确保你将数据发送到xxx.apple.com而不是本地主机)

理想情况下,这些测试请求甚至都不会传达到目标服务器——这样做意味着你依赖两个因素,而这两个因素并不总是完美稳定的:

  • 网络连接性
  • 目标服务器的可用性和适当功能

过去,我解决这个问题的方法是:首先手动发出正确的请求,捕获响应,然后在单元测试中模拟整个通信(使用例如nock)。这样,我完全掌握整个通信。


非常感谢您提供详尽的答案,以及提供nock链接,我之前没有听说过这个工具,看起来是测试一些东西的好方法! - clifgray

2
据我所知,没有办法检查APNS请求是否已经到达目的地。苹果公司对开发者有“一切都好,如果不好,那肯定是你的问题”的政策。如果像我开始编码时一样,事情没有改变,那么您可以通过2195端口发送原始数据(JSON负载,您可能知道整个格式),但您将不会得到任何响应。
唯一能想到的方法是,如果您有一个物理iOS设备(iPod、iPhone或iPad),您可以通过启动具有硬编码令牌的PUSH请求来“自动化”测试,该令牌对应于您的设备和测试应用程序,如果您收到通知,则说明它有效。
另外,请确保在防火墙后面操作时打开所有必需的端口,如果不起作用,请查看这篇文章:https://support.apple.com/en-us/HT203609

1
我会使用请求模拟框架,例如nock来拦截对APN的请求。这些URL似乎在代码这里中定位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接