2017-04-13 79 views
1

我单位在控制器测试功能,使用翻译过滤 我想用一个自定义值
我使用$provide的嘲讽值嘲笑过滤器,但它什么都不做
任何建议?
非常感谢您如何嘲笑angularJs筛选值单元测试

我的控制器:

function MainCtrl($scope,$filter){ 
     $scope.onDateChange = onDateChange; 

     var date = new Date(); 
     var date_format_filter = $filter("i18nFilter")("DATE_FORMAT_FILTER"); 
     // i want this to be dd/mm/yyyy 
     var date_format_moment = $filter("i18nFilter")("DATE_FORMAT_MOMENT"); 
     // i want this to be DD/MM/YYYY 
     console.log("DATE FORMAT" , date_format_moment); // print DATE_FORMAT_MOMENT in unit test = test fail 
     $scope.startDate = $filter('date')(date , date_format_filter); 
     $scope.endDate = $filter('date')(date , date_format_filter); 

     function onDateChange(whichDate){ 

      var startDateFormatted = moment($scope.startDate , date_format_moment).startOf('day').toDate(); 
      var endDateFormatted = moment($scope.endDate, date_format_moment).startOf('day').toDate(); 
       if(startDateFormatted.getTime() > endDateFormatted.getTime()){ 
        $scope.startDateError = true; 
        $scope.errorLabel = $filter("i18nFilter")("DATE_START_ERROR"); 
       }else { 
        $scope.monitoring.startDateError = false; 
       } 
     } 
    } 

我的单元测试

describe('CONTROLLER : MainCtrl', function() { 


    // MAIN VARIABLES ================================================================== 
    var $scope, 
     $controller, 
     $rootScope, 
     $filter; 


    // LOAD APP MODULE ================================================================= 
    beforeEach(module('myApp')); 


    // SETUP =========================================================================== 
    beforeEach(function() { 

     module(function($provide) { 
      $provide.value('i18nFilter', 'DD/MM/YYYY'); 
     }); 

     inject(function ($rootScope , _$controller_ , $injector) { 
       $scope   = $rootScope.$new(); 
       $filter = $injector.get("$filter"); 
       $controller  = _$controller_; 
       $controller = $controller('MainCtrl' , {$scope : $scope , $filter : $filter}); 
     }); 
    }); 

    // Controller initialization ------------------------------------------------------- 
    it('- Controller should be defined.', function() { 
     expect($controller).toBeDefined(); 
    }); 

    it('- Should test startDate change event KO .', inject(function($controller){ 
     var date_format_moment = 'DD/MM/YYYY'; 
     $scope.startDate = moment(new Date()).add(1, 'days').format(date_format_moment); 
     $scope.endDate = moment(new Date()).format(date_format_moment); 
     $scope.onDateChange('startDate'); 
     expect($scope.startDateError).toEqual(true); 
    })); 
}); 

回答

1

过滤器是一个功能和过滤服务有Filter后缀,所以它应该是i18nFilterFilter

beforeEach(module({ i18nFilterFilter: jasmine.createSpy() })); 

... 
i18nFilterFilter.and.returnValues('dd/mm/yyyy', 'DD/MM/YYYY'); 

的清洁器的方法是减少运动部件的模拟$filter本身的数量,

beforeEach(module({ $filter: jasmine.createSpy() })); 

... 
var i18nFilterMock = jasmine.createSpy().and.returnValues('dd/mm/yyyy', 'DD/MM/YYYY'); 
var dateFilterMock = ...; 

$filter.and.returnValues(i18nFilterMock, i18nFilterMock, dateFilterMock, dateFilterMock); 

... 
var ctrl = $controller('MainCtrl', ...); 

expect($filter.calls.count()).toBe(4); 
expect($filter.calls.allArgs()).toEqual([ 
    ['i18nFilter'], ['i18nFilter'], ['date'], ['date'] 
]); 

expect(i18nFilterMock.calls.count()).toBe(2); 
expect($filter.calls.allArgs()).toEqual([ 
    ['DATE_FORMAT_FILTER'], ['DATE_FORMAT_MOMENT'] 
]); 

应当提及的是兴农提供“智能”存根/探子比茉莉还有更多的功能,所以两者都可以一起使用。

+0

。谢谢,它完美的作品:) – ulquiorra

+0

不客气。 – estus