2 votes

Le check stub Sinon js est appelé avec des arguments exacts

Le check stub Sinon js est appelé avec les arguments exacts

Exigence : Je veux tester ejs.renderFile avec les bons arguments.

Mon fichier de fonction : 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 est : 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

1voto

Antonio Narkevich Points 2696

Cette ligne pose deux problèmes :

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

Tout d'abord, vous voulez que ejsStub soit appelé avec l'argument "data", mais lorsque vous appelez renderFile, vous l'enveloppez comme ceci : {data: data} .

La seconde est que cb_2 n'est pas égal à function (error, success) { if (error) ... } que vous passez réellement à renderFile.

Pour le faire fonctionner, exécutez-le comme suit :

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

Il n'est pas nécessaire de transmettre cb_2 ou quoi que ce soit d'autre, car le rappel réel est défini dans la fonction et ne peut pas être modifié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X