Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sinon js check stub called with exact arguments

Sinon js check stub called with exact arguments

Requirement: I want to test ejs.renderFile called with right arguments.

My function file: 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 is: 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

like image 961
Apoorva Shah Avatar asked Oct 29 '22 12:10

Apoorva Shah


1 Answers

Here are 2 problems with this line:

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

First, you want ejsStub to be called with argument 'data' but when you actually call renderFile you wrap it like this: {data: data}.

The second is that cb_2 is not equal function (error, success) { if (error) ... } that you are actually passing to renderFile.

To make it working run it like this:

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

There is no need to pass cb_2 or anything else because the actual callback is defined in the function and cannot be changed.

like image 65
Antonio Narkevich Avatar answered Nov 03 '22 00:11

Antonio Narkevich