Angularjs 如何在ES6类中模拟angular controller对自定义$filter进行单元测试

Angularjs 如何在ES6类中模拟angular controller对自定义$filter进行单元测试,angularjs,unit-testing,karma-jasmine,es6-class,Angularjs,Unit Testing,Karma Jasmine,Es6 Class,我有一个为angular控制器编写的ES类,我正在尝试使用angular mock编写jasmine测试 在构造函数中,我将$filter初始化为this.i18n=$filter('i18n'),这基本上是一个本地化筛选器,它接受一个键、值并返回该键的本地化值 我的问题是,由于类的构造函数有$filter,并且以后在类方法中使用。我的单元测试失败了。如何使用$filter进行测试,以确保测试不会失败。我希望模拟自定义过滤器 这是我得到的一个例外 TypeError: this.i18n i

我有一个为angular控制器编写的ES类,我正在尝试使用angular mock编写jasmine测试

在构造函数中,我将$filter初始化为this.i18n=$filter('i18n'),这基本上是一个本地化筛选器,它接受一个键、值并返回该键的本地化值

我的问题是,由于类的构造函数有$filter,并且以后在类方法中使用。我的单元测试失败了。如何使用$filter进行测试,以确保测试不会失败。我希望模拟自定义过滤器

这是我得到的一个例外

  TypeError: this.i18n is not a function
    at UsersCtrl.$onInit (test-context.js:35081:41)
    at Object.<anonymous> (test-context.js:35031:31)
这是我的单元测试

Import UsersCtrl from './users-controller.js';

     describe("given a new User Page", () => {
        var UserController;
        beforeEach(() => {
          angular.mock.module('app');
        });

    describe("when initialising  has completed", () => {
      beforeEach(() => {
         inject(($rootScope, $controller, $filter) => {
             const scope = $rootScope.$new();
             const filter = $filter
             UserController = $controller("UsersCtrl", { $scope: scope, $filter: filter});
          });
       });
    it("then users array for tab content should be empty initially",() => {
        const expectedActive = [];       
        expect(UserController.users).toEqual(expectedActive);
     });
    });
   });
问题是它运行测试但失败,因为它无法使用此进行初始化。i18n=$filter('i18n')。我应该如何初始化测试以将$filter传递到测试中?我是否可以模拟过滤器,因为我不想在此处测试过滤器

您可以:

  • 模拟整个
    $filter
    服务,并在测试中实例化时将其注入控制器;或
  • 模拟单个筛选器。然后,在加载模块时,可以使用
    $provide.value(key,value)
    ,其中key是筛选器名称加后缀:“filter”(这是注册筛选器时在内部执行的操作)
两者的一个例子是:

/*角度应用程序*/
(功能(){
“严格使用”;
类UsersCtrl{
构造函数($filter){
this.i18n=$filter('i18n');
this.users=[];
}
$onInit(){
此文件的用户数=[{
名称:this.i18n('用户')
}];
}
}
UsersCtrl.$inject=['$filter'];
有棱角的
.module('应用程序',[])
.controller('UsersCtrl',UsersCtrl);
})();
/*单元测试*/
(功能(){
“严格使用”;
description('给定新用户页',()=>{
让UsersController;
描述('模拟整个$filter服务:初始化完成时',()=>{
在每个之前(()=>{
模块(“应用程序”);
注入($rootScope$controller)=>{
UsersController=$controller(“UsersCtrl”{
$scope:$rootScope.$new(),
$filter:()=>{
//$filter将是一个返回noop函数(或我们想要的任何函数)的函数
返回0.noop;
}
});
});
});
它('然后选项卡内容的用户数组最初应为空',()=>{
常量expectedActive=[];
expect(userscocontroller.users).toEqual(expectedActive);
});
});
描述('模拟个人'i18n\'过滤器:初始化完成时',()=>{
在每个之前(()=>{
模块('app',($provide)=>{
//为我们的过滤器提供一个mock(noop函数)。
//注意命名约定,我们的过滤器名称+过滤器后缀。
$provide.value('i18nFilter',angular.noop);
});
注入($rootScope,$controller,$filter)=>{
UsersController=$controller(“UsersCtrl”{
$scope:$rootScope.$new(),
$filter:$filter
});
});
});
它('然后选项卡内容的用户数组最初应为空',()=>{
常量expectedActive=[];
expect(userscocontroller.users).toEqual(expectedActive);
});
});
});
})();

Import UsersCtrl from './users-controller.js';

     describe("given a new User Page", () => {
        var UserController;
        beforeEach(() => {
          angular.mock.module('app');
        });

    describe("when initialising  has completed", () => {
      beforeEach(() => {
         inject(($rootScope, $controller, $filter) => {
             const scope = $rootScope.$new();
             const filter = $filter
             UserController = $controller("UsersCtrl", { $scope: scope, $filter: filter});
          });
       });
    it("then users array for tab content should be empty initially",() => {
        const expectedActive = [];       
        expect(UserController.users).toEqual(expectedActive);
     });
    });
   });