2016-11-15 3 views
0

Ich habe folgende einfache Einheit Test:'undefiniert ist kein Objekt' in karma/Jasmin- Komponententest

describe('SyncController', function() { 
    var controller, 
     deferredRecount, 
     pouchdbServiceMock; 

    beforeEach(module('inspector')); 

    beforeEach(inject(function($controller, $q, $scope) { 
    deferredRecount = $q.defer(); 

    pouchdbServiceMock = { 
     getRecordCounts: jasmine.createSpy('getRecordCounts spy').and.returnValue(deferredRecount.promise) 
    }; 

    controller = $controller('SyncController', { 
     '$scope': $scope, 
     'pouchdbService': pouchdbServiceMock 
    }); 
    })); 

    beforeEach(inject(function(_$rootScope_) { 
    $rootScope = _$rootScope_; 
    controller.recount(); 
    })); 

    describe('recount', function() { 
    it('should call getRecordCounts on pouchdbService', function() { 
     expect(pouchdbServiceMock.getRecordCounts).toHaveBeenCalled(); 
    }); 
    }); 
}); 

pouchdbServiceMock.getRecordCounts im letzten describe Block Aufruf erzeugt einen Fehler:

TypeError: undefined is not an object (evaluating 'pouchdbServiceMock.getRecordCounts') in unit-tests/sync.controller.tests.js (line 29) 

Jedoch pouchdbServiceMock wird im zweiten beforeEach Block zugewiesen. Was ist falsch?

+0

Vielleicht müssen Sie die BeforeEach-Anweisungen innerhalb der zweiten beschreiben. – Hosar

+0

Hat nicht geholfen. Derselbe Fehler. –

Antwort

0

Das Problem war, dass der zweite Block before hatte einen Fehler:

Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope 

So ist es die Variable pouchdbServiceMock nicht initialisiert hat. Ich habe den Block ein wenig umgeschrieben:

beforeEach(inject(function($controller, $q, $rootScope) { 
    deferredRecount = $q.defer(); 
    scope = $rootScope.$new(); 

    pouchdbServiceMock = { 
     getRecordCounts: jasmine.createSpy('getRecordCounts spy').and.returnValue(deferredRecount.promise) 
    }; 

    controller = $controller('inspector.SyncController', { 
     '$scope': scope, 
     'pouchdbService': pouchdbServiceMock 
    }); 
    })); 

Dies löste das Problem.

0

Ihre Erklärung von pouchdbServiceMock ist ein bisschen seltsam, zumindest aus meiner Erfahrung Tests im letzten Jahr.

pouchdbServiceMock = jasmine.createSpy('getRecordCounts', ['getRecordCounts']); 
pouchdbServiceMock.getRecordCounts.and.returnValue(deferredRecount.promise); 
$provide.value('pouchdbService', pouchdbServiceMock); 

So würde ich es strukturieren. Probieren Sie es aus, sehen Sie, ob es funktioniert.

+0

Hat nicht geholfen. Derselbe Fehler ... :-( –

Verwandte Themen