嘲笑nodejs中的电子邮件function

我已经build立了一个邮件程序function,并试图提高覆盖率。 试图testing它的部分已经certificate棘手,特别是这个mailer.smtpTransport.sendMail

var nodemailer = require('nodemailer') var mailer = {} mailer.smtpTransport = nodemailer.createTransport('SMTP', { 'service': 'Gmail', 'auth': { 'XOAuth2': { 'user': 'test@test.com', 'clientId': 'googleClientID', 'clientSecret': 'superSekrit', 'refreshToken': '1/refreshYoSelf' } } }) var mailOptions = { from: 'Some Admin <test@tester.com>', } 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) } }) } 

我不确定如何进行testing,特别是确保我的mailer.smtpTransport.sendMail函数传递正确的参数,而不实际发送电子邮件。 我试图使用https://github.com/whatser/mock-nodemailer/tree/master ,但我可能做错了。 我应该嘲笑这个方法吗?

 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': 'dave@testco.com', '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('dave@testco.com','bleh') transport.sendMail(email, function() {}) }) }) 

您可以在testing中使用“存根”传输层而不是SMTP。

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

那么,在这种情况下,“消息”将成为文本格式的电子邮件。 像这样的东西:

 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: from@email.com To: to@email.com Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable My Message! 

有关更多示例,请参阅nodemailertesting套件: https : //github.com/andris9/Nodemailer/blob/master/test/nodemailer-test.js

expectEmail只是简单地挂钩到传输层,并且希望通过查看sentEmail内容来识别电子邮件(如果这是您期望的电子邮件,则返回true)。

在这种情况下, return sentEmail.to === 'dave@testco.com'就足够了。

请记住,这个模块是在一个环境中devise的,在这个环境中,testing以随机的顺序和同时进行。 您应该大量随机化您的数据以防止碰撞和误报。 顺便说一句,我们使用这样的东西: var to = Date.now().toString(36) + Faker.Internet.email();