2017-04-13 42 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