为什么我的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));
})
});
答案 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']);