2017-04-19 24 views
2

私はAWSラムダのノードハンドラで作業しています。私はその機能から統合テストをして別のファイルを作成する必要がありますが、sinonまたはmockeryでトランスポータをモックできません。node.js mock sendmailer transporter inside function

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" 
    } 
}); 
} 

目的は、それが呼び出されたときに、モカでのJavaScriptファイルテスト内の任意の電子メールを送信し、期待does notのように)(関数createTransporterを模擬することです:

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を書いた:)

あなたが抱えている問題は、あなたがmockery経由nodemailerをからかっている前に、あなたがvar index = require("../index.js");を呼び出しているということなので、それはモジュールのキャッシュにすでにあります。 READMEの例には// Make sure anything that uses nodemailer is loaded here, after it is mocked...が含まれていましたが、もっと明確にする必要があります。

nodemailerが侮られた後にrequire("../index.js")を移動すると、期待どおりに動作します。

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

別のオプションは、私は混合の結果を持っていたものの、mockery.resetCache();への呼び出しで{ useCleanCache: true }オプションを使用することです。モックリドキュメントのControlling the Module Cacheを参照してください。

+0

btw - これは少なくともあなたが嘲笑しているモジュールであれば真である。モックする前にモジュールを 'require()'しておくと、モックされていないモジュールをキャッシュします。 – doublesharp

0

私はこれが失敗する理由を100%わからないんだけど、私は2つのいずれかをお勧め:

  1. がをやってみ...あなたの問題である可能性があるわずかな違いがあります
  2. createTransporterをエクスポートするので、模擬したかどうかに新しい値を割り当てることができます。これはあまり「実装の詳細をプライベートに保つ」という意味ではありません。
  3. モジュールはクラスを返すか、とにかく「このトランスポーターメソッドを使用する」という値を設定できますか? (つまり、依存性注入)
+0

問題は実際には 'mockery'です - ' nodemailer'が 'nodemailer-mock'で侮られる前に' index.js'が必要であるため、実際のモジュールをキャッシュに入れるのではなく嘲笑された人。あなたはモジュールが嘲笑された後にrequire()/ assignment *をしなければなりません。 – doublesharp