parse nodejs node node.js nodemailer

node.js - nodejs - get url node js



Mocking función de correo electrónico en nodejs (4)

Tengo una función de correo que he creado e intentando apuntalar la cobertura. Tratar de probar partes de él ha resultado ser complicado, específicamente este mailer.smtpTransport.sendMail

var nodemailer = require(''nodemailer'') var mailer = {} mailer.smtpTransport = nodemailer.createTransport(''SMTP'', { ''service'': ''Gmail'', ''auth'': { ''XOAuth2'': { ''user'': ''[email protected]'', ''clientId'': ''googleClientID'', ''clientSecret'': ''superSekrit'', ''refreshToken'': ''1/refreshYoSelf'' } } }) var mailOptions = { from: ''Some Admin <[email protected]>'', } mailer.verify = function(email, hash) { var emailhtml = ''Welcome to TestCo. <a href="''+hash+''">Click this ''+hash+''</a>'' var emailtxt = ''Welcome to TestCo. This is your hash: ''+hash mailOptions.to = email mailOptions.subject = ''Welcome to TestCo!'' mailOptions.html = emailhtml mailOptions.text = emailtxt mailer.smtpTransport.sendMail(mailOptions, function(error, response){ if(error) { console.log(error) } else { console.log(''Message sent: ''+response.message) } }) }

No estoy seguro de cómo realizar las pruebas, asegurándome específicamente de que mi función mailer.smtpTransport.sendMail está pasando los parámetros correctos sin enviar el correo electrónico. Estoy tratando de usar https://github.com/whatser/mock-nodemailer/tree/master , pero probablemente lo estoy haciendo mal. ¿Debería estar burlándome del método?

var _ = require(''lodash'') var should = require(''should'') var nodemailer = require(''nodemailer'') var mockMailer = require(''./helpers/mock-nodemailer'') var transport = nodemailer.createTransport(''SMTP'', '''') var mailer = require(''../../../server/lib/account/mailer'') describe(''Mailer'', function() { describe(''.verify()'', function() { it(''sends a verify email with a hashto an address when invoked'', function(done) { var email ={ ''to'': ''[email protected]'', ''html'': ''Welcome to Testco. <a href="bleh">Click this bleh</a>'', ''text'': ''Welcome to Testco. This is your hash: bleh'', ''subject'': ''Welcome to Testco!'' } mockMailer.expectEmail(function(sentEmail) { return _.isEqual(email, sentEmail) }, done) mailer.verify(''[email protected]'',''bleh'') transport.sendMail(email, function() {}) }) })


Este ejemplo funciona bien para mí

======== myfile.js ========

// SOME CODE HERE transporter.sendMail(mailOptions, (err, info) => { // PROCESS RESULT HERE });

======== myfile.spec.js (archivo de prueba de la unidad) ========

const sinon = require(''sinon''); const nodemailer = require(''nodemailer''); const sandbox = sinon.sandbox.create(); descript(''XXX'', () => { it(''XXX'', done => { const transport = { sendMail: (data, callback) => { const err = new Error(''some error''); callback(err, null); } }; sandbox.stub(nodemailer, ''createTransport'').returns(transport); // CALL FUNCTION TO TEST // EXPECT RESULT }); });


Puede simular directamente la función sendMail, pero no es obvio cómo acceder a ella desde las pruebas. Se devuelve una instancia de Mailer cuando crea un transporte, por lo que necesita importar directamente esa clase a su prueba.

const Mailer = require(''nodemailer/lib/mailer'')

Luego, puede simular o anular el método sendMail en el prototipo de la forma habitual. Usando Jasmine, puedes hacerlo así:

beforeEach(function () { spyOn(Mailer.prototype, ''sendMail'').and.callFake(function (mailOptions, cb) { cb(null, true) }) })

El callFake garantiza que la devolución de llamada de sendMail aún se ejecute en el encapsulado que necesita para probar qué sucede a continuación. Puede simular fácilmente un error pasando un primer argumento a cb: cb(new Error(''Email failed''))

Ahora que ya está configurado el simulacro, puede comprobar que todo funciona como debe:

expect(Mailer.prototype.sendMail).toHaveBeenCalled()


Puede usar una capa de transporte ''Stub'' en su prueba en lugar de SMTP.

var stubMailer = require("nodemailer").createTransport("Stub"), options = { from: "[email protected]", to: "[email protected]", text: "My Message!" }; stubMailer.sendMail(options, function(err, response){ var message = response.message; })

Entonces, en ese caso, ''mensaje'' será el correo electrónico en formato de texto. Algo como esto:

MIME-Version: 1.0 X-Mailer: Nodemailer (0.3.43; +http://www.nodemailer.com/) Date: Fri, 25 Feb 2014 11:11:48 GMT Message-Id: <123412341234.e23232@Nodemailer> From: [email protected] To: [email protected] Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable My Message!

Para más ejemplos, eche un vistazo a la serie de pruebas de nodemailer: https://github.com/andris9/Nodemailer/blob/master/test/nodemailer-test.js


expectEmail simplemente se engancha a la capa de transporte y espera que usted identifique el correo electrónico (devuelva verdadero si este es el correo electrónico que está esperando) mirando el contenido del correo electrónico enviado.

En este caso, return sentEmail.to === ''[email protected]'' debería ser suficiente.

Sin embargo, tenga en cuenta que este módulo se diseñó en un entorno en el que las pruebas se ejecutan en un orden aleatorio y concurrentemente. Probablemente debería aleatorizar sus datos en gran medida para evitar colisiones y falsos positivos. Por cierto, usamos algo como: var to = Date.now().toString(36) + Faker.Internet.email();