5

Sto usando node.js (framework server) e mongoose.js (modellazione di schemi basati su mongo) come back-end per un'app iOS e sto usando Mocha (framwork di test) per assicurarmi che tutto funzioni.Test per notifica push Apple

Quello che voglio veramente sapere, e non posso trovare documentazione su, è come testare sul server se le notifiche push vengono inviate correttamente. Sto usando l'apnagent e al momento riesco a vedere che le notifiche push vengono inviate correttamente controllando manualmente il mio dispositivo, ma ho difficoltà a trovare un modo automatico per verificare che funzionino correttamente.


Questa può essere una descrizione sufficiente per rispondere a un livello elevato di ciò che è necessario fare. Ma nel caso in cui esso non è qui è il codice vero e proprio:

Mongoose modello spara una notifica push al momento della creazione:

#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??? 

Poi nel mio file di test Mocha ho:

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

risposta

3

In molte situazioni, durante la scrittura di test, è impossibile o semplicemente troppo pericoloso per verificare che un'azione sia realmente avvenuta (cioè è stata consegnata una notifica push). Immagina di scrivere un test unitario per il comando rm in cui desideri assicurarti che l'esecuzione di rm -rf / abbia esito positivo. Ovviamente, non puoi lasciare che questa azione abbia luogo e verificare che la tua partizione di root sia effettivamente vuota!

Ciò che si può fare, tuttavia (e dovrebbe farlo, davvero), è verificare che qualsiasi comando, routine o altra azione necessaria per eseguire l'attività venga invocata correttamente, senza consentire effettivamente che avvengano.

Nella tua situazione particolare, non è necessario verificare che la notifica push sia stata consegnata perché la tua applicazione non è responsabile della consegna della notifica. Tuttavia, è possibile verificare che la notifica push sia stata inviata correttamente al server push.

Così, invece di test per la consegna di successo, si prova

  1. se la richiesta in uscita viene formattata correttamente (vale a direJSON è valido)
  2. se contiene i dati ci si aspetta che contiene (cioè un campo in JSON è presente e contiene previsto i dati)
  3. se il token di autenticazione richiesto dal server è incluso
  4. Se il server di destinazione è corretto (per esempio, si sta infatti inviando i dati al xxx.apple.com e non a localhost)

Idealmente, queste richieste di prova sarà nemmeno raggiungere il server di destinazione - così facendo significherebbe si fa affidamento su due fattori che non sono sempre perfettamente stabili:

  • connettività di rete
  • disponibilità server di destinazione e la corretta funzionalità

In passato, sono trattate con questo in modo che ho emesso manualmente una richiesta corretta, catturato la risposta e poi deriso tutta la comunicazione nell'unità test (utilizzando cioè nock. In questo modo, ho completamente il controllo di tutta la comunicazione.

+0

Grazie mille per una risposta esaustiva e per il collegamento alla cocca, non ne avevo mai sentito parlare in precedenza e sembra un buon modo per testare alcune cose! – clifgray

1

I userebbe una struttura di simulazione di richieste come nock per intercettare la richiesta in APN. Gli URL sembrano essere situati nel codice here.

2

Per quanto ne so, non c'è modo di verificare se una richiesta APNS ha raggiunto la sua destinazione o meno. Apple tende ad avere questo "va tutto bene, e se non lo è, allora dovrebbe essere colpa tua" politica con noi sviluppatori. Se le cose non sono cambiate da quando ho iniziato la codifica, fai una richiesta APNS inviando dati grezzi (payload JSON, probabilmente conosci l'intero formato) attraverso la porta 2195, e non ottieni assolutamente alcuna risposta.

L'unica cosa che mi viene in mente, se si dispone di un dispositivo fisico iOS (un iPod, un iPhone o un iPad), è possibile "automatizzare" un test con il lancio di una richiesta push con un token hardcoded, corrispondente al dispositivo e un'app di test, e se si riceve la notifica, allora funziona.

Oh, e se non funziona, assicurati di avere tutte le porte necessarie aperte se stai operando dietro un firewall. È la prima grande pietra in cui mi sono tuffato quando mi sono tuffato in questa;) (correlato: https://support.apple.com/en-us/HT203609)

Problemi correlati