8

我正在尝试使用 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 小时里,我一直在尝试解决这个问题,但到目前为止还没有运气。据我所知,似乎没有其他人遇到这个问题。这让我觉得我可能在做一些愚蠢的事情。我真的很感激你们能给我的任何帮助。我很乐意发布您需要的任何其他代码(只要我可以自由地透露它)。

相关代码如下——

应用程序.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---
    });

});

业力.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;
4

3 回答 3

2

老实说,我根本不知道这是否是修复,它可能只适用于 Mocha,但我遇到了同样的事情,我将第一个 beforeEach 位更改为:

beforeEach(function() { module('myApp'); });

它似乎工作得更好。如果您让测试框架(在我的情况下为 mocha)具有该方法的包装版本,则 angular.mocks.module 调用的时间似乎会更好。

于 2014-05-08T21:23:02.270 回答
0

当问题只是未关闭)}

除此之外,调试问题的方法可能是简化直到问题消失。也就是说,开始删除大部分代码,一次一点,直到你“二进制搜索”了这个问题。

于 2014-04-02T23:48:03.347 回答
0

我有同样的问题。

就我而言,当您将angular 1.0.8angular-mocks 1.0.8与 Jasmine 的较新版本(2.0.0+,实际上并不那么新)一起使用时,会发生此错误

angular-mock 假定 Jasmine 中存在一些内部变量,并且在新版本中不再存在。有关更多详细信息,请参见https://github.com/angular/angular.js/issues/5632

解决方案是升级您的 Angular(在我的情况下不可能)或降级您的 Jasmine。

如果你使用 Grunt 运行 karma,将你的 karma-jasmine 降级到版本 '~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",
}
于 2015-05-27T15:57:51.047 回答