2017-02-24 3 views
1

J'essaie d'écrire des tests unitaires pour une fonction de middleware express qui envoie un courrier électronique en envoyant une requête ping à l'API Mailgun.Test de la méthode .send() Mailgun avec Mocha et Sinon

module.exports = { 
    sendEmail: function (req, res) { 
    let reqBody = req.body; 
    let to = reqBody.to; 
    let from = reqBody.from; 
    let subject = reqBody.subject; 
    let emailBody = reqBody.body; 

    let data = { 
     from: from, 
     to: to, 
     subject: subject, 
     text: emailBody 
    }; 

    mailgun.messages().send(data, function (error, body) { 
     if (error) { 
     res.status(400).json(error); 
     return; 
     } 
     res.status(200).json(body); 
    }); 
    } 
}; 

Le fichier de test:

describe('\'sendEmail\' method',() => { 
    let mailgun; 
    beforeEach(() => { 
     mailgun = require('mailgun-js')({ apiKey: MAIL_GUN_API_KEY, domain: MAIL_GUN_DOMAIN }); 
    }); 

    it.only('should send the data to the MailGun API', (done) => {  
     sinon.spy(mailgun, 'messages'); 
     sinon.spy(mailgun.messages(), 'send'); 

     emailMiddleware.sendEmail(request, response); 
     // using sinon-chai here 
     mailgun.messages().send.should.have.been.called(); 
     done();  
    }); 

Résultat sur l'exécution npm test:

TypeError: [Function] is not a spy or a call to a spy! 
  1. Comment puis-je tester si la méthode .send est appelée à mailgun.messages().send(...)? J'utilise directement l'API mailgun. Comment puis-je extirper mailgun lui-même?

Répondre

0

Comment puis-je vérifier si la méthode .send est appelée à mailgun.messages(). Envoyer (...)?

Vous devez talonner la méthode send, pas seulement l'espionner et la faire agir comme la vraie méthode.

C'est ce que je fais lorsque je veux remplacer le module mailgun-js.

// Mock sandbox 
    sandbox = sinon.sandbox.create() 

    mailgunSendSpy = sandbox.stub().yields(null, { bo: 'dy' }) 
    sandbox.stub(Mailgun({ apiKey: 'foo', domain: 'bar' }).Mailgun.prototype, 'messages').returns({ 
     send: mailgunSendSpy 
    }) 

Les méthodes yields passent les arguments null et {bo: 'dy'} au premier rappel qu'il fonde.

Je pense que cela répond à votre autre question aussi.

2

Vous avez à bouchonner mailgun-js vous devez bouchonner ce paquet et après que vous pouvez vérifier les retours que vous voulez

Parce que vous utilisez rappel, ne pas oublier de le retourner

const sandbox = sinon.sandbox.create(); 
sandbox.stub(mailgun({ apiKey: 'foo', domain: 'bar' }).Mailgun.prototype, 'messages') 
    .returns({ 
    send: (data, cb) => cb(), 
    }); 

// Your stuff... 

sandbox.restore(); 

Vous pouvez utiliser le sandbox.spy() pour vérifier ce que vous voulez, le comportement est le même que sinon.spy()Doc here