2013-07-12 37 views
8

Tôi đang cố gắng thực hiện một số kiểm thử Đơn vị cơ bản cho AngularJS sử dụng Karma. Tất cả các bài kiểm tra tôi đã viết có vẻ như chính xác về cú pháp. Nhưng tôi đang gặp vấn đề ở bước cơ bản nhất, tức là phần beforeEach của mã. Khi tôi thử chạy thử nghiệm, tôi nhận được sự cố sau đây

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) 

Tôi đã cố gắng giải quyết vấn đề này trong 36 giờ qua và không có may mắn cho đến nay. Theo như tôi có thể thấy, không ai khác dường như có vấn đề này. Điều này làm cho tôi nghĩ rằng tôi có thể làm điều gì đó ngu ngốc. Tôi thực sự đánh giá cao bất kỳ sự giúp đỡ nào mà mọi người có thể cho tôi. Tôi sẽ vui lòng đăng bất kỳ mã bổ sung nào mà bạn cần (miễn là tôi tự do tiết lộ nó).

Mã liên quan là following-

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 và ANGULAR_SCENARIO_ADAPTER dành cho thử nghiệm E2E vì vậy không cần bao gồm. Tôi không nghĩ đó là vấn đề của bạn. –

+0

Vâng, tôi cũng có các bài kiểm tra e2e. Tôi đã không bao gồm họ coz họ đang làm việc tốt và không liên quan đến vấn đề hiện tại của tôi. :) – user2438247

+2

Bạn đã bao giờ giải quyết vấn đề của mình chưa? – Chad

Trả lời

0

Tôi thường chạy vào lỗi này khi vấn đề chỉ đơn giản là một un-đóng ) hoặc }

Bên ngoài đó, một cách tiếp cận để gỡ lỗi vấn đề này có thể là để đơn giản hóa cho đến khi vấn đề đi xa. Đó là, bắt đầu loại bỏ các phần lớn mã, từng chút một, cho đến khi bạn "tìm kiếm nhị phân" cho vấn đề.

2

Thực sự tôi không biết nếu điều này là việc sửa chữa ở tất cả, và có lẽ nó chỉ hoạt động cho Mocha, nhưng tôi đã chạy vào điều tương tự và tôi đã thay đổi chút beforeEach đầu tiên này:

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

và dường như nó hoạt động tốt hơn. Có vẻ như thời gian của cuộc gọi angular.mocks.module hoạt động tốt hơn nếu bạn để khung kiểm tra (mocha trong trường hợp của tôi) có một phiên bản được bao bọc của phương thức.

0

Tôi gặp vấn đề tương tự.

Trong trường hợp của tôi, lỗi này xảy ra khi bạn sử dụng góc 1.0.8góc-mocks 1.0.8 với các phiên bản mới hơn của Jasmine (2.0.0+, không phải như vậy mới thực sự)

angular-mock giả định một số biến bên trong trong Jasmine và nó không tồn tại nữa trong phiên bản mới.Để biết thêm chi tiết, xem cái này https://github.com/angular/angular.js/issues/5632.

Giải pháp là nâng cấp Góc của bạn (không thể trong trường hợp của tôi) hoặc hạ cấp hoa nhài của bạn.

Nếu bạn sử dụng Grunt để chạy nghiệp, hãy hạ cấp hoa nhài của bạn xuống phiên bản '~ 0.1.0' sẽ khắc phục sự cố này. Phiên bản này bao gồm hoa nhài, vì vậy bạn cũng nên loại bỏ 'hoa nhài-lõi' khỏi devDependencies của bạn. Tập hợp các devDependencies bên dưới làm việc cho tôi.

"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", 
} 
Các vấn đề liên quan