2017-04-19 33 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