2017-02-11 1 views
1

Sinon js Scheck Stub genannt Check-Stub mit genauen ArgumenteSinon js mit genauen Argumente

Anforderung genannt: Ich möchte ejs.renderFile mit richtigen Argumenten aufgerufen testen.

Meine Funktion Datei: 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); 
         } 
        } 
       }); 
      } 
     }); 
}; 

Mt Test: 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

Antwort

1

Hier sind zwei Probleme mit dieser Zeile:

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

Zuerst möchten Sie, dass ejsStub mit dem Argument 'data' aufgerufen wird, aber wenn Sie renderFile tatsächlich aufrufen, wickeln Sie es wie folgt um: {data: data}.

Die zweite ist, dass cb_2 ist nicht gleich function (error, success) { if (error) ... }, die Sie tatsächlich an renderFile übergeben.

Damit es es so laufen Arbeiten:

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

Es gibt keine Notwendigkeit cb_2 oder irgendetwas anderes, weil die tatsächliche Rückruf in der Funktion definiert passieren und nicht verändert werden kann.

+0

danke @ antonio-narkevich seine Arbeit ... –