2013-07-12 38 views
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小時,到目前爲止有沒有運氣。據我所知,沒有人似乎有這個問題。這讓我覺得我可能做了一些愚蠢的事情。我真的很感激任何人們可以給我的幫助。我會很高興發佈你需要的任何附加代碼(只要我可以隨意泄露它)。

相關的代碼是以下各項

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; 
+1

ANGULAR_SCENARIO和ANGULAR_SCENARIO_ADAPTER是端到端的測試,從而不必列入。我不認爲這是你的問題雖然。 –

+0

是的,我也有e2e測試。我沒有包括他們,因爲他們工作得很好,與我目前的問題無關。 :) – user2438247

+2

你有沒有解決你的問題? – Chad

回答

0

我經常遇到這樣的錯誤時,這個問題很簡單的,一個未封閉的)}

外,調試問題的方法可能是簡化,直到問題消失。也就是說,一次開始刪除大部分代碼,直到您對該問題進行「二進制搜索」。

2

老實說,我不知道這是修復可言,它可能只適用於摩卡,但我也陷入了同樣的事情,我改變了第一beforeEach位到這一點:

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

,它似乎工作得更好。看起來像angular.mocks.module調用的時機更好,如果你讓測試框架(在我的情況下是mocha)有一個包裝版本的方法。

0

我有同樣的問題。

在我的情況下,當您使用角1.0.8角嘲笑1.0.8與茉莉花的新版本(2.0.0+,沒有那麼新實際)

出現此錯誤angular-mock在Jasmine中假定了一些內部變量,並且在新版本中不再存在。有關更多詳細信息,請參閱這一個https://github.com/angular/angular.js/issues/5632

解決方案是升級你的Angular(不可能在我的情況下)或降級你的茉莉花。

如果你使用Grunt來運行業力,降低你的業力茉莉花版本'〜0.1.0'將解決這個問題。這個版本包含茉莉花,所以你也應該從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", 
} 
相關問題