2013-09-24 90 views
6

Tôi đang cố gắng thử nghiệm ứng dụng AngularJS của mình với Jasmine qua Karma. Tôi nhận được lỗi này (ít nhất, đây là mới nhất của họ):Thử nghiệm nhà máy AngularJS trong Karma với Jasmine

Uncaught TypeError: Cannot read property '$modules' of null 
    at /Users/benturner/Dropbox/Code/galapagus/app/static/js/angular-mocks.js:1866 

Từ karma.conf.js tôi:

files: [ 
     'static/js/jquery.min.js', 
     'static/js/angular.min.js', 
     'static/js/angular-mocks.js', 
     'static/js/angular-resource.min.js', 
     'static/js/angular-scenario.js', 
     'static/js/angular-loader.min.js', 
     'static/js/momentous/ctrl_main.js', // contains all my app's code 
     'test/momentous.js' 
], 

Sau đây là thử nghiệm của tôi:

(function() { 
    "use strict"; 

    var controller = null; 
    var scope = null; 

    describe("Services", inject(function($rootScope, Moments) { 
     var mockedFactory, moments, flag, spy; 
     moments = [{name: 'test'}]; 

     beforeEach(module('momentous', function($provide) { 
      scope = $rootScope.$new(); 

      $provide.value('$rootScope', scope); 

      mockedFactory = { 
       getList: function() { 
        return moments; 
       } 
      }; 
      spy = jasmine.createSpy(mockedFactory.getList); 

      $provide.value('Moments', mockedFactory); 
     })); 

     it('should return moments from the factory service', function() { 
      runs(function() { 
       console.log(scope.getList); 
       flag = false; 
       setTimeout(function() { 
        scope.getList(); 
        flag = true; 
       }, 500); 
      }); 

      waitsFor(function() { 
       return flag; 
      }, "The call is done", 750); 

      runs(function() { 
       expect(scope.moments).toEqual([{name: 'test'}]); 
       expect(spy).toHaveBeenCalled(); 
      }); 
     }); 
    })); 

}()); 

Vì vậy, những gì tôi đang cố gắng làm là thử dịch vụ nhà máy của tôi và kiểm tra xem nó đang trả về một mảng các đối tượng và đặt chúng thành một biến trong phạm vi $.

Có một cuộc gọi không đồng bộ trong đó vì vậy tôi phải sử dụng hàm run() và waitsFor().

Tôi vẫn không hiểu làm cách nào tôi tiêm phạm vi $ của mình để tôi có thể thử nghiệm với nó và với angular-mocks.js hiện đang cho tôi lỗi tôi cảm thấy mình đang dần dần giải quyết vấn đề này, chứ không phải gần hơn.

Tôi đã kết hợp điều này với nhau từ nhiều tài liệu, hướng dẫn và câu trả lời stackoverflow khác nhau. Bất kỳ hướng dẫn nào? Cảm ơn.

Trả lời

10

Tôi cũng gặp phải lỗi chính xác này. Mã của tôi là tương tự, nơi tôi đang cố gắng để kiểm tra một nhà cung cấp vì vậy tôi gọi module và vượt qua nó một chức năng cấu hình các nhà cung cấp.

SOLVED:

Tôi phát hiện thấy vấn đề là do gọi "tiêm" để trả lại đại biểu cho phương thức "mô tả". Bạn chỉ có thể sử dụng tiêm để trả lại một đại biểu cho "nó".

Ví dụ:

describe('something', inject(function(something) {})); // will throw the $module is null error 

Nhưng điều này sẽ làm việc:

it('something', inject(function(something) {})); // works :) 
+0

'tiêm() 'cũng có thể được sử dụng trong' beforeEach() 'cuộc gọi. –

+2

Vì vậy, điều này không được giải quyết. Một số người hiểu nên giải thích lý do tại sao khi đi qua tất cả các tài liệu khác nhau để hiểu nó là khó hiểu. –