2017-04-19 80 views
2

林与AWS拉姆达的节点处理工作模拟sendmailer转运,我需要与从功能集成测试的另一个文件,但我不能嘲笑与兴农或嘲弄的转运。Node.js的内部功能

的index.js功能:

var nodemailer = require('nodemailer'); 

exports.handler = (event, context, callback) => 
{ 
    var transporter=createTransporter(); 
    transporter.sendMail(data, function (error, success) { 
     console.log(error); 
     response = getResponse(404, error); 
    } 
    callback(null, response); 
    }); 
} 

function createTransporter() { 
return nodemailer.createTransport({ 
    service: "SMTP", 
    auth: { 
     user: "[email protected]", 
     pass: "XXXX" 
    } 
}); 
} 

目的是嘲笑功能createTransporter(),因此它不发送的电子邮件时,它被称为在JavaScript文件测试与摩卡和期待:

var mockery = require('mockery'); 
var nodemailerMock = require('nodemailer-mock'); 
var index = require("../index.js"); 

describe("The handler function tests", function() { 
    before(function() { 
     mockery.enable({ 
      warnOnUnregistered: false 
     }); 
     mockery.registerMock('nodemailer', nodemailerMock); 
    }); 

    it('JSON error html ', function() { 
     var callback = function (name, response) { 
      expect(JSON.stringify(response.statusCode)).to.be('404'); 
     }; 
     var context = {}; 
     index.handler(event, context, callback); 
    }); 
}); 
+0

你看https://github.com/doublesharp/nodemailer-mock? –

+0

我没有,但也许我做错了什么 – acknowledge101

回答

0

我写nodemailer-mock :)

您遇到的问题是,你在呼唤你var index = require("../index.js");通过mockery嘲讽nodemailer之前,所以它已经在模块高速缓冲存储器。我在自述文件的例子中包含了// Make sure anything that uses nodemailer is loaded here, after it is mocked...,但应该更清楚。

移动require("../index.js")nodemailer被嘲笑,这将是工作的预期。

var mockery = require('mockery'); 
var nodemailerMock = require('nodemailer-mock'); 

// don't require here since you will get the real nodemailer and cache it 
var index; 

describe("The handler function tests", function() { 
    before(function() { 
     mockery.enable({ 
      warnOnUnregistered: false 
     }); 
     mockery.registerMock('nodemailer', nodemailerMock); 

     // do the require() here after nodemailer is mocked 
     index = require("../index.js"); 
    }); 

    // your tests here should now use nodemailer-mock 
    it('JSON error html ', function() { 
     var callback = function (name, response) { 
      expect(JSON.stringify(response.statusCode)).to.be('404'); 
     }; 
     var context = {}; 
     index.handler(event, context, callback); 
    }); 
}); 

另一种选择是使用{ useCleanCache: true }选项与调用mockery.resetCache();,但我有不同的结果。请参阅嘲笑文档中的Controlling the Module Cache

+0

顺便说一句 - 这对任何你模拟的模块都是正确的,至少是用“嘲讽”。如果你在模拟之前需要()一个模块,你将缓存真实的模块而不是模拟的模块。 – doublesharp

0

我不是100%知道为什么会失败,但我建议两两件事之一:

  1. 尝试做var createTransporter = function() ...这里有一个细微的差别,可能是您的问题
  2. 出口createTransporter,所以你可以在新的值赋给它,无论是模拟还是不行。这不是很“保持实现细节私人化”,它可以工作
  3. 让你的模块返回一个,或者无论如何可以设置一些“使用这个传输方法”值的对象。 (即依赖注入)
+0

这个问题实际上是'mockery' - 因为'index.js'是nodemailer'被嘲笑与'nodemailer-mock'它会在缓存中的实际模块,而不是之前需要'嘲笑的那个。在模块被模拟后,你必须做require()/赋值*。 – doublesharp