使用$ location和$ routeParams等依赖项测试Angular指令

丹尼尔

这个问题与我如何通过Jasmine在Karma上将模拟依赖项注入角度指令有关但我无法弄清楚。继承人的东西:

我有一个简单的angular指令,可以使用几个参数来渲染我的合体的头部。一个通过,两个来自URL vie $ location和$ routeParam。该指令如下所示:

    'use strict';
myApp.directive('appHeader', ['$routeParams', '$location', function ($routeParams, $location) {
    return {
        restrict: 'E',
        templateUrl: 'path/to/partials/template.html',
        scope: {
            icon: '@icon'
        },
        link: function (scope, element, attributes) {
            var lastUrlPart = $location.path().split('/').pop();
            scope.project = $routeParams.itemName;
            scope.context = lastUrlPart === scope.project ? '' : lastUrlPart;
        }
    };
}]);

这称为通过<app-header icon="bullhorn"></app-header>

现在,我想添加一些测试。至于模板渲染,我已经完成了。以下工作与预期的一样。测试通过。

describe('appHeader', function () {
    var element, scope;

    beforeEach(module('myApp'));
    beforeEach(module('myAppPartials'));

    beforeEach(inject(function ($rootScope, $compile) {
        element = angular.element('<app-header icon="foo"></app-header>');
        scope = $rootScope;
        $compile(element)(scope);
        scope.$digest();
    }));

    it('should contain the glyphicon passed to the directive', function () {
        expect(element.find('h1').find('.glyphicon').hasClass('glyphicon-foo')).toBeTruthy();
    });

});

现在,我要测试是否将scope.context和scope.project设置为依赖项$ location和$ routeParams,这些当然是我要模拟的。我该如何处理。

例如,我尝试了上面链接的问题的答案:

beforeEach(module(function ($provide) {
        $provide.provider('$routeParams', function () {
            this.$get = function () {
                return {
                    itemName: 'foo'
                };
            };
        });
    }));

但是在我的测试中

it('should set scope.project to itemName from $routeParams', function () {
        expect(scope.project).toEqual('foo');
});

scope.project 未定义:

Running "karma:unit:run" (karma) task
Chrome 35.0.1916 (Mac OS X 10.9.3) appHeader should set scope.project to itemName from routeParams FAILED
        Expected undefined to equal 'foo'.
        Error: Expected undefined to equal 'foo'.

至于位置依赖性,我试图像这样设置一个Mock mysel:

var LocationMock = function (initialPath) {
            var pathStr = initialPath || '/project/bar';
            this.path = function (pathArg) {
                return pathArg ? pathStr = pathArg : pathStr;
            };
        };

然后在每个之前注入$ location,并为path()的调用设置一个spyOn,如下所示:

spyOn(location, 'path').andCallFake(new LocationMock().path);

但是,然后scope.context也未定义。

it('should set scope.context to last part of URL', function () {
    expect(scope.context).toEqual('bar');
});

有人可以指出我在这里做错了吗?

ne4istb

提供程序的模拟工作正常,但问题出在范围之内。您的指令具有隔离范围。因此,该指令的作用域是test中定义的作用域的子级。快速但不推荐的解决方法是:

it('should set scope.project to itemName from $routeParams', function () {
    expect(scope.$$childHead.project).toEqual('foo'); });

测试指令时,请尽量避免使用范围。更好的方法是模拟模板并检查其中的数据。对于您的情况将是这样的:

    var viewTemplate = '<div>' +
        '<div id="project">{{project}}</div>' +
    '</div>';

    beforeEach(inject(function ($templateCache) {
        $templateCache.put('path/to/partials/template.html', viewTemplate);
    }));

并测试:

    it('should set scope.project to itemName from $routeParams', function () {
        expect(element.find('#project').text()).toEqual('foo');
    });

对于上下文,它将是相同的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Jasmine以uibModal和lodash作为依赖项测试服务

Angular2服务测试:使用beforeEach注入依赖项

Angular测试使用RouteParams的控制器

在gradle上使用缓存的依赖项和插件运行黄瓜测试

使用Jetty进行HTTP / 2优先级和依赖项测试

Angular 2如何使用router和location.go()检测后退按钮的按下状态?

如何在Angular项目中使用带有TypeScript,接口和依赖项注入的多态

删除未使用的Angular模块依赖项(导入和提供程序)

在 angular 中,同时使用 ngRoute 和 ui.grid 作为依赖项会使页面变为空白

使用JSm设置location.hash和location.href

如何使用RSpec测试依赖项::destroy?

使用 spock 中的依赖项测试服务

使用ROME依赖项和cobertura-maven-plugin防止“ MVN站点”目标中的测试错误

使用Angular 6测试时,有什么方法可以自动处理依赖项注入?

Apache RewriteRule是否干扰If和Location指令?

Angular指令使用模糊和聚焦

如何使用依赖项测试Angular 6服务,该依赖项使用私有方法/属性修改公共方法/属性的输出

使用打字稿将依赖项注入angularjs指令

“新”未使用的依赖项和未使用的依赖项之间有什么区别?

使用$ parsers(和$ formatters)对指令进行单元测试

使用Owin和Simple Injector进行UserManager依赖项注入

无法使用Gradle和Intellij导入jar文件依赖项

使用package.json在全局和本地安装依赖项

使用 VSTS 和 Nuget Pack 自动添加 nuget 依赖项

使用包和依赖项手动构建映像

使用pip和requirements.txt安装链接的依赖项?

使用Composer嵌套的依赖项和私有存储库

使用 sbt 和 IntelliJ IDEA 管理依赖项

使用多个dbcontext实例和依赖项注入