如何为使用$ filter' date'的函数创建单元测试?

时间:2014-11-26 10:38:41

标签: angularjs unit-testing jasmine karma-jasmine angular-filters

我正在为我的控制器中的函数编写单元测试。

该函数使用$ filter格式化'yyyy-MM-dd'格式的日期。

然而,我的业力脚本无法在使用过滤器的行之后运行。

以下是功能:

$scope.myFunction = function (someDate) {

    var dateTo = new Date(someDate);
    var myDate = $scope.myDate;

    // Code fails after line below on unit test /////
    var searchdate = (filter('date')(myDate, 'yyyy-MM-dd'));
    searchdate = serviceConvertISODate.convertDate(searchdate);        
}

在上面的示例中,var myDate = 1405967947000(epoc格式)

单元测试:

describe('Validating functions within Controller', function () {        

    var scope, ctrl, filter, localServiceConvertISODate;

    beforeEach(inject(function($controller, $rootScope, $filter, serviceConvertISODate) {
        scope = $rootScope.$new(),
        ctrl = $controller('MyController', {
            $scope: scope,
            filter : $filter,
            serviceConvertISODate : localServiceConvertISODate
        });                
    }));

    it('should test my function', function() {

        var dateTo = new Date("22 Sep 2014");
        console.log("********* dateTo = " + dateTo );

        var myDate = $scope.myDate;
        console.log("********* myDate = " + myDate );

        var searchdate = (filter('date')(myDate, 'yyyy-MM-dd'));
        console.log("searchdate after filter = " + searchdate);

        searchdate = localServiceConvertISODate.convertDate(searchdate);            

    });
});

我可以看到我的日志:

dateTo is returning the correct new date

myDate is returning the correct myDate

但是,应用下一行(过滤器)会导致测试中断并且不会出现错误。

2 个答案:

答案 0 :(得分:2)

检查您的代码。您出于某种原因(为什么?)将AngularJS $filter作为filter传递给您的控制器,如果您的控制器请求注入,那么这可能会有效,但是您尝试使用{{1}测试代码中的变量,其值未定义。如果您想在以后使用它,请在filter中设置值:

beforeEach()

此外,我不确定您是否只是在调试,或者提供的代码是否显示您正在尝试执行的操作。如果是后者,请注意单元测试应该从外部"测试您的单元。因此,如果结果符合您的预期,那么它应该真正调用您的filter = $filter; 一些数据并进行测试。您不能将功能内部复制到测试中。

答案 1 :(得分:0)

describe('Service: myService', function () {

  beforeEach(module('myApp'));

  var myService, 
    httpBackend, 
    fromDate,
    toDate;

  var d = new Date();

  beforeEach(inject(function (_myService_, $httpBackend, $filter) {
    myService = _myService_;
    httpBackend = $httpBackend;
    fromDate = $filter('date')(new Date(d - 86400000 * 15), 'yyyy-MM-dd');
    toDate = $filter('date')(d, 'yyyy-MM-dd');
  }));

  // ...

}