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

时间:2016-07-20 16:30:37

标签: javascript angularjs unit-testing jasmine

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

Spec runner:

<!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>

Angular模块:

(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;

规格:

'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));
    })
});

1 个答案:

答案 0 :(得分:2)

此错误

  

TypeError:无法读取属性&#39> be&#39;未定义的

清楚地说明这段代码存在错误

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

而不是common服务。

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

Jasmine具有涵盖on a single page的简单API,规范应该变为

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

common变量可能无声地变为undefined的唯一情况是common服务被意外覆盖以返回undefined。在任何其他情况下,都会抛出注入错误。

规范中的注入错误

  

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

是因为没有加载第三方模块文件而且模块没有加载到common模块中。

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

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

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

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