1

我已经创建了一个绑定处理程序,它依赖于用于格式化日期的时刻。我想用Jasmine单元测试这个绑定处理程序。单元测试与茉莉花敲除绑定处理程序

下面是我的结合处理代码:

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).format(format); 
       }; 
      ko.bindingHandlers.text.update(element, formattedDate); 
     } 
    }; 

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

我如下创建我的规格文件:

define(['testUtils', 'jquery', 'knockout'], function (testUtils, $, ko) { 

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

     var testee; 

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

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

     describe('ko.bindingHandlers.date', function() { 
      var element = document.createElement(); 

      it('should be true', function() { 
       expect(true).toBe(true); 
      }); 
     }); 
    }); 
}); 

不知道从哪里开始测试,需要进行测试哪些部分。

+2

一个相当宽泛的问题......你可能想看看如何淘汰赛测试自身默认绑定:https://github.com/knockout/knockout/tree/master/spec/defaultBindings – user3297291

+1

感谢@ user3297291这个参考对我有用:) –

+0

这些测试在幻影JS 1.9.8中失败 –

回答

2

检查了它们如何对单元测试自定义绑定的敲除规范。

他们使用javascript动态创建元素,并将KO绑定为其中一个。

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

    'use strict'; 
    ddescribe('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); 
     } 

     describe('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('-'); 
      }); 
     }); 
    }); 
});