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();