2015-04-29 2 views
3

Как бы я STUB следующего модуля с proxyquire и Синоном:заглушки с proxyquire

var email = require("emailjs").server.connect.send(); 

я сделал следующее, но он не работает, потому что, когда я пытаюсь вызвать ошибку в send() он по-прежнему посылает электронную почту ,

sendMailStub = sinon.stub(email, "send");  
testedModule = proxyquire('../index.js', { 
       'email': { 
        'server': { 
         'send': sendMailStub 
         } 
        } 
      }); 

А также попробовал:

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

Это полный тест до сих пор, что не удается:

var chai = require('chai'); 
var sinonChai = require("sinon-chai"); 
var sinon = require('sinon'); 
chai.use(sinonChai); 
var proxyquire = require('proxyquire'); 
var testedModule; 
var expect = chai.expect; 



describe('invoicer', 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" 
    } 

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

    var sendStub, readFileStub, url, contextDoneSpy, obj, connectStub; 

    before(function() { 

     readFileStub = sinon.stub(); 
     sendStub = sinon.stub().withArgs(mailOptions).callsArgWith(1, null, contextDoneSpy); 
     connectStub = sinon.stub().returns({ 
      send: sendStub 
     }); 

     testedModule = proxyquire('../index', { 
      'fs': {readFile: readFileStub}, 
      'emailjs': { 
       'server': { 
        'connect': connectStub 
       } 
      } 
     }); 

     url = "http://somewhere.com/orders"; 
     contextDoneSpy = sinon.spy(); 
     obj = { 
      user: 'AKIAJMHSJRRYGKTE4TOQ', 
      password: 'Ag3Nkpej8dxZ4DwYz2in/x8kUhN7Lh/BqXImB0+i+DWy', 
      host: "email-smtp.eu-west-1.amazonaws.com", 
      port: 587, 
      tls: true, 
      ssl: false 
     } 

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

     connectStub(); 
    }); 

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

    }); 
}); 

ответ

6

Давайте сначала исправьте строку, где ваш описанный emailjs с использованием ИТС documentation

require("emailjs").server.connect({ 
    /* Required server options */ 
}).send(function (err, message) { 
    // This a function with a callback node convention signature 
}); 

connect является функцией и должен получить некоторые параметры, кроме того send не возвращает вещь, в принципе вызвать функцию обратного вызова

Proxyquire требует, чтобы использовать то же имя модуля, поэтому email должен быть emailjs, с другой стороны, вы» повторное неправильное назначение заглушки в proxiquire, он должен быть

connectStub = sinon.stub().returns(sendStub); 
sendMailStub = sinon.stub(email, "send");  
testedModule = proxyquire('../index.js', { 
      'emailjs': { 
       'server': { 
        'connect': connectStub 
       } 
     }); 
+0

при запуске теста он возвращает 'TypeError: Объект # не имеет метод«connect'' – hyprstack

+0

@hyprstack вы можете также заглушки 'connect', чем создать и вернуть объект, тогда вы сможете проверить вызовы на 'c onnect' –

+0

Я обновил свой вопрос с помощью моего полного теста. Однако я получаю следующую ошибку: '1) invoicer« до всех »hook: TypeError: должен обернуть свойство объекта – hyprstack