【问题标题】:How to create a unit test for a function that uses $filter 'date'如何为使用 $filter 'date' 的函数创建单元测试
【发布时间】:2015-01-24 15:37:53
【问题描述】:

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

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

但是,我的 karma 脚本无法在使用过滤器的行之后运行。

功能如下:

$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

但是,应用下一行(过滤器)会导致测试中断并且没有提供错误。

【问题讨论】:

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


    【解决方案1】:

    检查您的代码。由于某种原因(为什么?),您将 AngularJS $filter 作为 filter 传递给您的控制器,如果您的控制器请求注入,这可能会起作用,但是您尝试在测试代码中使用 filter 变量,其中它的价值是不确定的。如果您想稍后使用它,请设置 beforeEach() 中的值:

    filter = $filter;
    

    另外,我不确定您是否只是在调试,或者提供的代码是否显示了您正在尝试执行的操作。如果是后者,请注意单元测试应该从“外部”测试您的单元。所以它真的应该用一些数据调用你的$scope.myFunction,并测试结果是否符合你的期望。您不会将函数的内部复制到测试中。

    【讨论】:

    • 感谢您的回复,这是有道理的,但是我对测试真的很陌生,所以很抱歉。你能提供代码sn-p吗?当我尝试时,我得到 TypeError: 'undefined' is not a function (evaluate '$filter('date')')。
    • 你读过the developer guide to unit-testing in AngularJS吗?我将首先在您的代码中使用$filter,然后一起删除filter
    • 如果我删除过滤器和 var searchdate = ($filter('date')(myDate, 'yyyy-MM-dd'));我收到错误 ReferenceError: Can't find variable: $filter
    • $filter('date') 不是我创建的过滤器。它是来自 Angular 站点的 epoc 转换建议:$filter('date')(date, format, timezone) docs.angularjs.org/api/ng/filter/date
    • 看我的回答。如果您删除filter,您仍然必须将$filter 保存到测试中可见的变量中,如果您想在其中使用它。变量可见性是基本的东西,在重新发布之前先尝试一些调试。
    【解决方案2】:
    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');
      }));
    
      // ...
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多