我正在尝试使用Karma对AngularJS进行一些基本的单元测试。我写的所有测试在语法上都是正确的。但是我在最基本的步骤中遇到了问题,即代码的beforeEach部分。当我尝试运行测试时,我遇到以下问题
TypeError: Cannot read property '$injector' of null
at Object.workFn (http://localhost:9876/absolute/Users/vesriram/Documents/AngularJS%20project/vendor/js/angular-mocks.js:1698:15)
at Object.<anonymous> (http://localhost:9876/adapter/lib/angular-scenario.js:26360:54)
at Array.forEach (native)
at Object.forEach (http://localhost:9876/adapter/lib/angular-scenario.js:9593:11)
过去36小时我一直试图解决这个问题,到目前为止一直没有运气。据我所知,没有其他人似乎遇到这个问题。这让我觉得我可能做了些蠢事。我真的很感激你们能给我的任何帮助。我很乐意发布您需要的任何其他代码(只要我可以自由地泄露它)。
相关代码如下 -
app.js
var sell_page = angular.module("sell_page", ['ui.bootstrap']);
sell_page.controller('ItemTitleController', ['$scope','listingInformationService', '$location',function($scope, listingInformationService, $location) {
$scope.itemNames = getAllItemNames();
$scope.draftItems = getAllSavedDrafts();
document.getElementById("categorySelection").style.visibility = "hidden";
------bunch of code-------
}]);
controllersSpec.js
describe("Unit: Testing Controllers", function() {
beforeEach(angular.mock.module('sell_page'));
it('should have a ItemTitleController controller', function() {
expect(sell_page.ItemTitleController).not.to.equal(null);
});
describe("ItemTitleController", function() {
var scope;
beforeEach(angular.mock.module('sell_page'));
beforeEach(angular.mock.inject(function($rootScope, listingInformationService, $location, $controller) {
var scope = $rootScope.$new();
var controller = $controller('ItemTitleController', {
$scope : scope
});
}));
it("should display xxx properly", function() {
--some code---
});
});
karma.conf.js
basePath = '';
files = [
JASMINE,
JASMINE_ADAPTER,
'../vendor/js/angular.min.js',
'../vendor/js/angular.js',
'../vendor/js/angular-mocks.js',
'../vendor/js/angular-scenario.js',
ANGULAR_SCENARIO,
ANGULAR_SCENARIO_ADAPTER,
'../app/js/*.js',
'e2e/*.js',
'midway/*.js',
'unit/*.js',
];
exclude = [
];
reporters = ['progress'];
port = 9876;
runnerPort = 9100;
colors = true;
logLevel = LOG_INFO;
autoWatch = true;
browsers = ['Chrome'];
captureTimeout = 60000;
singleRun = false;
答案 0 :(得分:2)
老实说,我根本不知道这是否是修复,它可能只适用于Mocha,但我遇到了同样的事情,我将第一个之前的位更改为:
beforeEach(function() { module('myApp'); });
似乎工作得更好。看起来像angular.mocks.module调用的时机更好,如果你让测试框架(在我的情况下是mocha)有一个包装版本的方法。
答案 1 :(得分:0)
当问题只是一个未关闭的)
或}
除此之外,调试问题的方法可能是简化,直到问题消失。也就是说,开始一次删除大部分代码,直到你对该问题进行“二进制搜索”。
答案 2 :(得分:0)
我有同样的问题。
在我的情况下,当您使用较新版本的Jasmine(2.0.0 +, angular 1.0.8 和 angular-mocks 1.0.8 )时会发生此错误实际上并不那么新鲜)
angular-mock假设Jasmine中有一些内部变量,并且在新版本中不再存在。有关更多详细信息,请参阅此https://github.com/angular/angular.js/issues/5632。
解决方案是升级你的Angular(在我的情况下不可能)或降级你的Jasmine。
如果您使用Grunt来运行业力,将您的业力茉莉降级为版本'~0.1.0'将解决此问题。此版本包含jasmine,因此您还应该从devDependencies中删除“jasmine-core”。下面的devDependencies集对我有用。
"devDependencies": {
"grunt-karma": "^0.10.1",
"karma": "^0.12.31",
"karma-chrome-launcher": "^0.1.7",
"karma-coverage": "^0.2.7",
"karma-jasmine": "~0.1.0",
"karma-junit-reporter": "^0.2.2",
"karma-phantomjs-launcher": "^0.1.4",
"phantomjs": "^1.9.15",
}