2015-04-28 18 views
1

我正在爲Invoicer模塊編寫測試。sinon stubs在nodejs測試中不起作用

我有兩個問題與我的測試。第一個原因是電子郵件仍然被髮送,儘管它已經存在emailjs模塊(第一次測試),第二個問題是我的第二次測試超時後2secs。

我不明白爲什麼?

任何人都可以幫我解決這個問題嗎?

Invoicer

'use strict'; 

var fs = require('fs'); 
var _ = require('underscore'); 
var request = require("request"); 
var email = require("emailjs"); 


exports.Invoicer = function (url, context) { 

    // set-up our transporter object with credentials 
    var transporter = email.server.connect({ 
     user: 'Pinoquio', 
     password: 'sdlfkjlj', 
     host: "[email protected]", 
     port: 444, 
     tls: true 
    }); 

    // read html file for email 
    fs.readFile('./email.html', function(error, data){ 

     if (error) { 
      context.done(new Error("There was an error reading the file ---> %s", error.message)); 
     } 

     data = data.toString(); 

     var template = _.template(data); 

     // request data from url 
     request(url, function (error, response, body) { 
      if(error) { 
       context.done(new Error("There was an error with request --> %s", error.message)); 
      } 

      if (!error && response.statusCode == 200) { 

       if(typeof body === "string") { 
        var _body = JSON.parse(body); 
       } 

       var populated_html = template(_body); 

       var mailOptions = { 
        text: populated_html, 
        from: 'hick <[email protected]>', // sender address 
        to: '<[email protected]>', // recipient 
        subject: 'Invoice' 
       } 

       transporter.send(mailOptions, function(error, message){ 
        if(error){ 
         context.done(new Error("There was an error sending the email: %s", error.message)); 
        }else{ 
         context.done(); 
        } 
       }); 
      } 
     }); 
    }); 
}; 

Tests

var chai = require('chai'); 
var sinonChai = require("sinon-chai"); 
var sinon = require('sinon'); 
chai.use(sinonChai); 
var proxyquire = require('proxyquire'); 
var testedModule; 
var fs = require('fs'); 
var email = require('emailjs').server.connect(); 
var expect = chai.expect; 


describe('invoicer successful process', function() { 

    var nock = require('nock'); 

    var ResponseOptions = { 
     username: "Peter Pan", 
     user_address_line_1: "Never Never Land", 
     user_address_line_2: "Tree-house 99", 
     user_post_code: "E4 9BY", 
     delivery_address_line_1: "Hook's Boat", 
     delivery_address_line_2: "Dock 69", 
     delivery_post_code: "SE2 4C", 
     order_number: "234234234", 
     order_date: "20/12/2090", 
     dispatch_date: "20/12/2090", 
     items: [ 
      { 
       product_name: "Fairy Dust", 
       brand: "Airy fairy", 
       quantity: 5, 
       total: 2000 
      }, 
      { 
       product_name: "Pirate Sword", 
       brand: "Pirate's Bay", 
       quantity: 8, 
       total: 2000 
      } 
     ], 
     grand_total: 4000, 
     user_email: "[email protected]" 
    } 

    var mailOptions = { 
     text: "Hello World", 
     from: 'hick <[email protected]>', // sender address 
     to: '<[email protected]>', // recipient 
     subject: 'Invoice' 
    } 

    var scope = nock("http://beta.hick.com") 
     .get("/orders") 
     .reply(200, ResponseOptions); 

    var sendMailStub, readFileStub, url, contextDoneSpy, server; 

    before(function() { 

     server = sinon.fakeServer.create(); 
     server.autoRespond = true; 

     sendMailStub = sinon.stub(email, "send"); 
     readFileStub = sinon.stub(fs, 'readFile'); 

     testedModule = proxyquire('../index.js', { 
      fs: {readFile: readFileStub}, 
      email: {send: sendMailStub} 
     }); 

     url = "http://beta.hick.com/orders"; 
     contextDoneSpy = sinon.spy(); 

     readFileStub.withArgs('./email.html').callsArgWith(1, null, 'file1'); 

     sendMailStub.withArgs(mailOptions).yields(null, contextDoneSpy); 

    }); 

    after(function() { 
     fs.readFile.restore(); 
     email.send.restore(); 
     server.restore(); 
    }); 

    it("readFile and successful context.done were called", function (done) { 
     testedModule.Invoicer(url, { done: function() { 
      contextDoneSpy.apply(null, arguments); 
      expect(readFileStub).has.been.called; 
      expect(contextDoneSpy).to.have.been.calledWithExactly(); 
      done(); 
     }}); 
    }); 
}); 

describe("fs.readFile", function() { 

    var readFileStub, url, contextDoneSpy, server; 

    before(function() { 

     server = sinon.fakeServer.create(); 
     server.autoRespond = true; 

     readFileStub = sinon.stub(fs, 'readFile'); 

     testedModule = proxyquire('../index.js', { 
      fs: {readFile: readFileStub} 
     }); 

     url = "http://beta.hick.com/orders"; 
     contextDoneSpy = sinon.spy(); 

     readFileStub.withArgs("Hello world").callsArgWith(1, new Error("Error reading file"), null); 

    }); 

    after(function() { 
     fs.readFile.restore(); 
     server.restore(); 
    }); 

    it("returns error", function (done) { 
     testedModule.Invoicer(url, { done: function() { 
      contextDoneSpy.apply(null, arguments); 
      expect(contextDoneSpy).has.been.called.and.calledWith(new Error("Error reading file")); 
      done(); 
     }}); 


    }); 
}); 

回答

1

我已經設法解決第二個問題首先通過將returncontext.done(new Error....)

fs.readFile後(」 ./ email.html ',功能(錯誤,數據){

if (error) { 
    context.done(new Error("There was an error reading the file ---> %s", error.message)); 
    return; 
} 

,並通過傳遞有效的文件名在我的測試,而不是隻是一個隨機字符串:

readFileStub.withArgs("./email.html").callsArgWith(1, new Error("Error reading file"), null); 
}); 

after(function() { 
    fs.readFile.restore(); 
});