jeudi 7 juillet 2016

Jasmine unit tests working on chrome but failing on terminal

I have a knockout js custom binding which needs to be tested. I've written tests based on creating HTML elements and then applying the binding on it.

The tests work on Chrome browser and give expected result but it fails with PhantomJS/Terminal.

define(['testUtils', 'knockout', 'moment', 'utils/date.binding'], function (testUtils, ko, moment) {

    'use strict';
    describe('utils/date.binding', function () {

        var testee,
            targetElement,
            dateValue;

        beforeEach(function (done) {
            testUtils.loadWithCurrentStubs('utils/date.binding', function (dateUtils) {
                testee = dateUtils;
                done();
            });
        });

        afterEach(function () {
            testUtils.reset();
        });

        function createTestNode() {
            targetElement = document.createElement('div');
            targetElement.innerHTML = '<div id="dateBindingElement" data-bind="date: dateValue, format: \'DD MMM YYYY\'"></div>';
            document.body.appendChild(targetElement);
        }

        function deleteTestNode() {
            var element = document.getElementById('dateBindingElement');
            element.parentNode.removeChild(element);
        }

        ddescribe('ko.bindingHandlers.date', function () {

            beforeEach(createTestNode);
            afterEach(deleteTestNode);

            it('should take an observable date 02-01-2017 and format it to DD MMM YYYY format - 01 Feb 2017', function () {
                dateValue = ko.observable('02-01-2017');
                ko.applyBindings({dateValue: dateValue}, targetElement);
                expect(document.getElementById('dateBindingElement').innerHTML).toBe('01 Feb 2017');
            });

            it('should take a string date 02-01-2017 and format it to DD MMM YYYY format - 01 Feb 2017', function () {
                dateValue = '02-01-2017';
                ko.applyBindings({dateValue: dateValue}, targetElement);
                expect(document.getElementById('dateBindingElement').innerHTML).toBe('01 Feb 2017');
            });

            it('should take any date (string or observable) and conver it to requested format. 02-01-2017 to MM DD YY', function () {
                dateValue = '02-01-2017';

                targetElement.innerHTML = '<div id="dateBindingElement" data-bind="date: dateValue, format: \'MM-DD-YY\'"></div>';
                document.body.appendChild(targetElement);

                ko.applyBindings({dateValue: dateValue}, targetElement);
                expect(document.getElementById('dateBindingElement').innerHTML).toBe('02-01-17');
            });

            it('should return - if the date value is null or undefiled or blank', function () {
                dateValue = '';
                ko.applyBindings({dateValue: dateValue}, targetElement);
                expect(document.getElementById('dateBindingElement').innerHTML).toBe('-');
            });

            it('should accept a moment object and display the date', function () {
                dateValue = moment();
                ko.applyBindings({dateValue: dateValue}, targetElement);
                expect(document.getElementById('dateBindingElement').innerHTML).toBe(moment().format('DD MMM YYYY'));
            });
        });
    });
});

This is the binding handler:

define(['knockout', 'moment'], function (ko, moment) {

    'use strict';
    ko.bindingHandlers.date = {
        update: function (element, dateValue, allBindings) {
            var date = ko.utils.unwrapObservable(dateValue()) || '-',
                format = allBindings.get('format'),
                formattedDate = function () {
                    return moment(date).isValid() ? moment(date).format(format) : '-';
                };
            ko.bindingHandlers.text.update(element, formattedDate);
        }
    };

    return {
        dateBinding: ko.bindingHandlers.date
    };
});

This is the result on chrome:

SUCCESS ko.bindingHandlers.date should take an observable date 02-01-2017 and format it to DD MMM YYYY format - 01 Feb 2017 debug.html:34
SUCCESS ko.bindingHandlers.date should take a string date 02-01-2017 and format it to DD MMM YYYY format - 01 Feb 2017 debug.html:34
SUCCESS ko.bindingHandlers.date should take any date (string or observable) and conver it to requested format. 02-01-2017 to MM DD YY debug.html:34
SUCCESS ko.bindingHandlers.date should return - if the date value is null or undefiled or blank debug.html:34
SUCCESS ko.bindingHandlers.date should accept a moment object and display the date 

This is the result on PhantomJS/Terminal

PhantomJS 1.9.8 (Linux 0.0.0) - ko.bindingHandlers.date:
PhantomJS 1.9.8 (Linux 0.0.0)   should take an observable date 02-01-2017 and format it to DD MMM YYYY format - 01 Feb 2017 FAILED
PhantomJS 1.9.8 (Linux 0.0.0)   should take a string date 02-01-2017 and format it to DD MMM YYYY format - 01 Feb 2017 FAILED
PhantomJS 1.9.8 (Linux 0.0.0)   should take any date (string or observable) and conver it to requested format. 02-01-2017 to MM DD YY FAILED
PhantomJS 1.9.8 (Linux 0.0.0)   should return - if the date value is null or undefiled or blank PASSED
PhantomJS 1.9.8 (Linux 0.0.0)   should accept a moment object and display the date PASSED
PhantomJS 1.9.8 (Linux 0.0.0): Executed 5 of 2201 (3 FAILED) (0.245 secs / 0.04 secs)
PhantomJS 1.9.8 (Linux 0.0.0)
PhantomJS 1.9.8 (Linux 0.0.0) ko.bindingHandlers.date should take an observable date 02-01-2017 and format it to DD MMM YYYY format - 01 Feb 2017 FAILED
    Expected '-' to be '01 Feb 2017'.
    Error: Expected '-' to be '01 Feb 2017'.
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/test/spec/utils/date.binding.spec.js:40
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/test/spec/utils/date.binding.spec.js:13
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1690
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:865
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1140
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:131
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1190
        at each (/home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:56)
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1191
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:940
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1177
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:783
        at callGetModule (/home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1204)
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1583
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1711
PhantomJS 1.9.8 (Linux 0.0.0) ko.bindingHandlers.date should take a string date 02-01-2017 and format it to DD MMM YYYY format - 01 Feb 2017 FAILED
    Expected '-' to be '01 Feb 2017'.
    Error: Expected '-' to be '01 Feb 2017'.
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/test/spec/utils/date.binding.spec.js:46
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/test/spec/utils/date.binding.spec.js:13
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1690
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:865
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1140
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:131
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1190
        at each (/home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:56)
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1191
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:940
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1177
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:783
        at callGetModule (/home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1204)
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1583
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1711
PhantomJS 1.9.8 (Linux 0.0.0) ko.bindingHandlers.date should take any date (string or observable) and conver it to requested format. 02-01-2017 to MM DD YY FAILED
    Expected '-' to be '02-01-17'.
    Error: Expected '-' to be '02-01-17'.
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/test/spec/utils/date.binding.spec.js:56
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/test/spec/utils/date.binding.spec.js:13
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1690
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:865
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1140
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:131
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1190
        at each (/home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:56)
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1191
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:940
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1177
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:783
        at callGetModule (/home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1204)
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1583
        at /home/dev/InventoryProject/web/cbs-inventory-web-client/node_modules/requirejs/require.js:1711

Somehow I feel moment object is not getting recognized properly.

Aucun commentaire:

Enregistrer un commentaire