2017-02-11 20 views
1

Sinon проверка окурок расслоения плотного называется с точными аргументамиSinon проверка окурок расслоения плотного называется с точными аргументами

Требования: Я хочу проверить ejs.renderFile вызвано с правильными аргументами.

Моя функция файл: html_to_pdf_converter.js

var ejsToPdfConvert = function (template, data, callback) { 

    var row = data.voucher; 
    html = ejs.renderFile(
     path.join(__dirname+'/../../views/', template), 
     { 
      data: data 
     }, 
     function (error, success) { 
      if (error) { 
       callback(error, null); 
      } else { 

       var pdfPath = getPdfUploadPath(row); 

       htmlToPdf.convertHTMLString(success, pdfPath, function (error, success) { 
        if (error) { 
         if (typeof callback === 'function') { 
          callback(error, null); 
         } 

        } else { 
         if (typeof callback === 'function') { 
          callback(null, success, pdfPath); 
         } 
        } 
       }); 
      } 
     }); 
}; 

тест мТл: html_to_pdf_converter.test.js

describe("ejs to html converter", function() { 
    it('ejs to html generation error', function() { 

     var data = { 
      voucher: {}, 
      image_path: 'tmp/1.jpg', 
      date_format: '', 
      parameters: '' 
     }; 

     var cb_1 = sinon.spy(); 
     var cb_2 = sinon.spy(); 
     var ejsStub = sinon.stub(ejs, 'renderFile'); 
     var pathStub = sinon.stub(path, 'join'); 

     ejsStub.callsArgWith(2, 'path not found', null); 

     htmlToPdfConverter.ejsToPdfConvert('voucher', data, cb_1); 

     sinon.assert.calledOnce(ejs.renderFile); 
     sinon.assert.calledOnce(path.join); 
     sinon.assert.calledOnce(cb_1); 
     sinon.assert.calledWith(ejsStub, path.join('views/', templateName), data, cb_2); //Error in this line 


     ejsStub.restore(); 
     pathStub.restore(); 
    }); 
}); 

enter image description here

ответ

1

Вот 2 проблемы с этой линии:

sinon.assert.calledWith(ejsStub, path.join('views/', templateName), data, cb_2); 

Во-первых, вы хотите, чтобы ejsStub вызывался с данными аргумента, но когда вы на самом деле вызываете renderFile, вы завершаете его следующим образом: {data: data}.

Во-вторых, cb_2 не равно function (error, success) { if (error) ... }, что вы фактически переходите к renderFile.

Чтобы сделать его работу запустить его так:

sinon.assert.calledWith(ejsStub, path.join('views/', templateName), {data: data});

Там нет необходимости передавать cb_2 или что-нибудь еще, потому что фактический обратный вызов определяется в функции и не может быть изменен.

+0

благодарит @ antonio-narkevich свою работу ... –