为什么我的 Jasmine 规范认为我的 Angular 模块未定义

2024-02-09

为什么我的 Jasmine 规范认为我的 Angular 模块未定义?我在实际模块代码下方添加了一行代码,将布尔值设置为 true,然后我从规范中对其进行 console.log,它指示 true。我还尝试更改模块,使其不是超范围(我的术语)或 IIFE,但这没有效果。错误消息的要点是Expected undefined to equal <jasmine.any(Object)>.

规格跑步者:

<!DOCTYPE HTML>
<html>

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Angular Spec Runner</title>

  <link rel="shortcut icon" type="image/png" href="lib/jasmine-2.4.1/jasmine_favicon.png">
  <link rel="stylesheet" type="text/css" href="lib/jasmine-2.4.1/jasmine.css">

  <script type="text/javascript" src="lib/jasmine-2.4.1/jasmine.js"></script>
  <script type="text/javascript" src="lib/jasmine-2.4.1/jasmine-html.js"></script>
  <script type="text/javascript" src="lib/jasmine-2.4.1/boot.js"></script>

  <script type="text/javascript" src="../../bower_components/angular/angular.min.js"></script>
  <script type="text/javascript" src="https://code.angularjs.org/1.5.2/angular-mocks.js"></script>

  <!-- include source files here... -->
  <script type="text/javascript" src="../services/common/common.js"></script>

  <!-- include spec files here... -->
  <script type="text/javascript" src="specs/commonSpec.js"></script>
</head>

<body>
</body>

</html>

角度模块:

(function () {
    'use strict';

    var commonModule = angular.module('common', []);

    commonModule.factory('common',
        ['$q', '$rootScope', '$timeout', '$location', 'logger', 'toaster', common]);

    function common($q, $rootScope, $timeout, $location, logger, toaster) {
        var throttles = {};

        var service = {
            isPhoneNumber: isPhoneNumber
        };

        return service;

        function isPhoneNumber(phoneStr) {
            phoneStr = phoneStr.replace(/\D/g, ''); //strips parens, dots, dashes, etc.
            return phoneStr.length === 10
                    && parseInt(phoneStr, 10) >= 2000000000 //area code can't start with 0 or 1
                    && parseInt(phoneStr.slice(-7), 10) >= 2000000; //exchange can't start with 0 or 1
        };
    }
})();

window.commonModuleLoaded = true;

Spec:

'use strict';

describe('common', function () {
    var common;

    beforeEach(module('common'));

    beforeEach(inject(function (_common_) {
        common = _common_;
    }));

    console.log('window.commonModuleLoaded :' + window.commonModuleLoaded);

    it('is an object', function () {
        expect(common).toEqual(jasmine.any(Object));
    })
});

这个错误

类型错误:无法读取未定义的属性“be”

明确表示这段代码有问题

expect(common).to.be.a('Object');

并且不在common服务。

这是因为代码是从使用 Chai 框架进行断言的规范粘贴的,而不是 Jasmine,这两个框架具有不同的 API。 Chai 语法使用点分隔符,Jasmine 方法采用驼峰式。

Jasmine 具有简单的 API,已涵盖在单个页面上 http://jasmine.github.io/edge/introduction.html,规格应变为

expect(common).toEqual(jasmine.any(Object));

唯一的情况是当common变量可能会变成undefined默默地是什么时候common服务被意外覆盖返回undefined。在任何其他情况下都会抛出注入错误。

规范中的注入错误

错误:[$injector:unpr] 未知提供程序:loggerProvider http://errors.angularjs.org/1.5.2/$injector/unpr?p0=loggerProvider%20%3C-%20logger%20%3C-%20common

原因是第三方模块文件未加载且模块未加载common module.

解决此问题的一种方法是在规范中加载依赖项:

beforeEach(module('loggerModuleName', 'toasterModuleName', 'common'));

但更好的方法是修复common模块本身,因为模块应该显式声明其依赖项,而不仅仅是依赖父模块来加载它们:

var commonModule = angular.module('common', ['loggerModuleName', 'toasterModuleName']);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 Jasmine 规范认为我的 Angular 模块未定义 的相关文章

随机推荐