了解测试中的过滤器注入

时间:2014-03-17 16:04:55

标签: javascript angularjs testing filter

我已经开始在youtube上观看有关angularJS的a tutorial video series。在名为测试概述的视频中,John Lindquist创建了一个这样的应用程序:

var myApp = angular.module("myApp", []);
myApp.filter('reverse', function(){
    return function(text)
    {
         return text.split("").reverse().join("");
    }
})
function firstCtrl($scope, Data){
    $scope.data = Data;
}

然后他用Karma和Jasmine创建了一个单元测试:

describe('filter', function()
{
    beforeEach(module('myApp'));
    describe('reverse', function()
    {
        it('should reverse a string', inject(function(reverseFilter) {
            expect(reverseFilter('ABCD')).toEqual('DCBA');
        }))
    })
})

测试通过,代码没问题,但我找不到原因。

我制作了自己的副本,以便了解maggic发生的位置......在听到AngularJS的这个参数命名之后,我将inject(function(reverseFilter)更改为inject(function(anytext)并停止了工作正如所料。

然后我注意到如果我像myApp.filter('foe', function()那样重命名我的过滤器,则必须使用inject(function(foeFilter)完成注入调用。

这是从哪里来的? AngularJs的注入系统似乎使用一些camelcase将'Filter'连接到过滤器的名称,但我无法在任何地方找到有关此过程的任何文档。我也发现使用inject(function(foe)不起作用的“有趣”,而将参数名称与相对依赖项匹配似乎是获取AngularJS中依赖项的最简单方法。 AngularJS是否对其他类型的依赖项执行此操作?

任何帮助都将不胜感激。

您可以在angularJs官方教程here中看到以这种方式测试过滤器的示例。

非常感谢。

1 个答案:

答案 0 :(得分:1)

是的,过滤器角度连接'过滤器'这个名字。他们也与提供商这样做。使用$providemodule.provide创建提供商时,您可以通过附加'提供商'来访问配置块中的提供商。这个名字。我不是100%肯定的原因,但这种方式可以确保您注入配置块的内容确实已配置为提供程序(或常量),如果是过滤器,则使用时他们在你的HTML

<div ng-repeat="stuff in things | filter:model"></div>

angular可以确保查找名为&#39; filterFilter&#39;的过滤器。如果您要在其中放置一个名为filter的服务,它将无法正常工作,因此angular希望允许通过相同的定义名称创建过滤器和服务,同时使用稍微不同的名称保存它们。这有帮助吗?