2013-09-24 17 views
6

Próbuję przetestować moją aplikację AngularJS z Jasmine przez Karmę. I ten błąd (przynajmniej, jest to ostatni z nich):Testowanie fabryczne AngularJS w karmie z Jasmine

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

Z moich karma.conf.js:

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' 
], 

Oto moja próba:

(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(); 
      }); 
     }); 
    })); 

}()); 

Więc próbuję zrobić to kpić z mojej usługi fabrycznej i sprawdzić, czy zwraca ona tablicę obiektów i ustawia je w zmiennej w polu $ scope.

Jest tam również połączenie asynchroniczne, więc musiałem użyć run() i waitFor().

Nadal nie rozumiem, w jaki sposób wstrzykiwam mój $ scope, tak, że mogę testować przeciwko niemu, a dzięki angular-mocks.js teraz daje mi błąd, czuję, że jestem coraz dalej od rozwiązania tego, nie bliższy.

Zrobiłem to razem z różnych dokumentów, poradników i odpowiedzi na pytanie o stackoverflow. Jakieś wskazówki? Dzięki.

Odpowiedz

10

Utknąłem też, otrzymując ten dokładny błąd. Mój kod jest podobny tam, gdzie próbuję przetestować dostawcę, więc wzywam moduł i przekazuję mu funkcję, która konfiguruje dostawcę.

rozwiązany:

Znalazłem problem jest ze względu na powołanie „wstrzyknąć”, aby powrócić do delegata „opisują” metody. Możesz użyć tylko inject, aby przywrócić delegata do "it".

Na przykład:

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

Ale to będzie działać:

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

'wstrzykują()' może być również używany w 'beforeEach()' połączeń. –

+2

To nie jest rozwiązane. Niektórzy, którzy rozumieją, powinni wyjaśniać, dlaczego przechodzenie przez różne dokumenty, aby to zrozumieć, jest mylące. –

Powiązane problemy