javascript - 类型错误 : undefined is not a constructor

标签 javascript angularjs phantomjs karma-jasmine

我是 Angular 的新手,我仍在努力弄清楚其中的大部分内容。我正在使用从 Yeoman Generator 生成的 Angular 1.5.8 编写一些测试。

具体来说,我正在尝试弄清楚如何操纵 $httpBackend 结果(我不确定这是否重要)...

在我的 app.js 文件中,我有以下代码:

.run(['$rootScope', '$location', 'breadcrumbService', function ($rootScope, $location, breadcrumbService) {
    $rootScope.$on('$viewContentLoaded', function () {
        jQuery('html, body').animate({scrollTop: 0}, 200);
    });

    $rootScope.isEditMode = false;
    $rootScope.$on('$stateChangeSuccess', function () {
        // ------------ this next line is failing -----------
        $rootScope.isEditMode = $location.path().toLowerCase().endsWith('/edit') || $location.path().toLowerCase().endsWith('/new');
    });

    $rootScope.parseJson = function (value) {
        return angular.fromJson(value);
    };

    $rootScope.bc = breadcrumbService;

    $rootScope.title = "";
}])

大约一半的行(我添加评论的地方)失败了。具体来说,endsWith 函数失败(toLower 没问题),出现以下错误:

PhantomJS 2.1.1 (Windows 8 0.0.0) Service: breadcrumbService should return breadcrumb label in json format FAILED
        TypeError: undefined is not a constructor (evaluating '$location.path().toLowerCase().endsWith('/edit')') in app/scripts/app.js (line 44)
        app/scripts/app.js:44:72
        $broadcast@bower_components/angular/angular.js:18005:33
        bower_components/angular-ui-router/release/angular-ui-router.js:3353:32
        processQueue@bower_components/angular/angular.js:16383:30
        bower_components/angular/angular.js:16399:39
        $eval@bower_components/angular/angular.js:17682:28
        $digest@bower_components/angular/angular.js:17495:36
        $apply@bower_components/angular/angular.js:17790:31
        done@bower_components/angular/angular.js:11831:53
        handleResponse@bower_components/angular-mocks/angular-mocks.js:1368:17
        flush@bower_components/angular-mocks/angular-mocks.js:1808:26
        test/spec/services/breadcrumbservice.js:33:27
        invoke@bower_components/angular/angular.js:4718:24
        workFn@bower_components/angular-mocks/angular-mocks.js:3085:26

这是我的测试代码(一些从不同示例修改而来的垃圾 - 只是试图让它工作):

'use strict';

describe('Service: breadcrumbService', function () {

    // load the service's module
    beforeEach(module('myModule'));

    var $httpBackend, $rootScope, createController, authRequestHandler;
    beforeEach(inject(function($injector) {

        $httpBackend = $injector.get('$httpBackend');
        console.log('Is null? '+ ($httpBackend == null));
        $httpBackend.whenGET(/views\/.*/).respond(200, [{}, {}, {}]);

        authRequestHandler = $httpBackend.when('GET', '/api/v1/SiteStagings')
            .respond({userId: 'userX'}, {'A-Token': 'xxx'});

        // Get hold of a scope (i.e. the root scope)
        $rootScope = $injector.get('$rootScope');
        $httpBackend.flush();
    }));

    // instantiate service
    var breadcrumbService;
    beforeEach(inject(function (_breadcrumbService_) {
        breadcrumbService = _breadcrumbService_;
    }));

    it('svc should exist', function () {
        expect(!!breadcrumbService).toBe(true);
    });

    it('should return breadcrumb label in json format', function () {
        var result = breadcrumbService.getFromCache('site', 'SiteGroupStagings', 46, 'SiteGroupDesc');
        console.log(result);
        expect(!!result).toBe(true);

    });
});

我不怀疑我在这里做错了什么,我只是不太明白它是什么。这个错误的真正含义是什么?为什么它不喜欢我对 endsWith 的调用?

谢谢

最佳答案

undefined is not a constructor

是 PhantomJS 在您尝试调用未定义的函数时显示的错误消息。这取决于您的 PhantomJS 支持的 ECMAScript 版本。所以正如你所说,它在 Chrome 中运行良好,因为这个浏览器支持你在测试中使用的功能。 为了解决您的问题并仍然能够使用 PhantomJS,您可以用一些替代函数替换“PhantomJS 未知”函数。

关于javascript - 类型错误 : undefined is not a constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38928987/

相关文章:

javascript - 如何在 Tampermonkey 中获取 cookie?

angularjs - 为这些用例定义 Node 议程作业

javascript - AngularJS $location 目录

javascript - Angular js ng样式不起作用

phantomjs - casperjs下载csv文件时出现问题

ruby-on-rails - 在 Ruby On Rails 上使用 PhantomJS 进行动态页面的服务器端渲染

javascript - 隐藏使用 javascript 和 css 不完全可见的文本行

javascript - 为什么即使未单击按钮,子组件 onclick 中的设置状态也会导致递归循环?

java - 如何添加 PhantomJSDriver 命令行参数

javascript - IE7 和 8 将不需要的阴影添加到另一个表格内的表格