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