2016-10-05 4 views
5

ich eine ngResourceMockFactory haben, die wie folgt aussieht:Mocking ngResource in Winkeleinheit testet

(function() { 
    'use strict'; 

    angular.module('app') 
    .factory('NgResourceMock', ngResourceMockFactory) 
    ; 

    ngResourceMockFactory.$inject = []; 

    function ngResourceMockFactory() { 
    function NgResourceMock() { 
     var context = this; 

     context.$promise.then = function() { 
     context.prototype.$promise.then.apply(context, arguments); 
     }; 

     context.$promise.finally = function() { 
     context.prototype.$promise.finally.apply(context, arguments); 
     }; 
    } 

    NgResourceMock.prototype.$promise = { 
     then: function(onSuccess, onError) { 
     this.$promise.onSuccess = onSuccess; 
     this.$promise.onError = onError; 
     }, 
     finally: function(onComplete) { 
     this.$promise.onComplete = onComplete; 
     } 
    }; 

    return NgResourceMock; 
    } 
})(); 

spritze ich dies in meinen Tests in einem beforeEach etwa so:

beforeEach(inject(function(NgResourceMock) { 
    ngResourceMock = new NgResourceMock(); 
})); 

dann habe ich es wie folgt verwenden :

describe('initiateWorkflow function', function() { 
    beforeEach(function() { 
    vm.player = {id: 123}; 
    spyOn(dataService, 'initiateWorkflow').and.returnValue(ngResourceMock); 
    vm.initiateWorkflow(); 
    }); 

    it('should call dataService.initiateWorkflow', function() { 
    expect(dataService.initiateWorkflow).toHaveBeenCalledWith({playerId: vm.player.id}, {}); 
    }); 
}); 

aber ich halte die folgende Fehlermeldung zu sehen:

Das führt mich zu der Annahme, dass etwas mit meinem ngResourceMockFactory nicht stimmt, aber ich bin mir nicht sicher, was es ist.

+0

Der Kontext ist nur eine Instanz von NgResourceMock, daher ist 'context.prototype' nicht definiert, Sie sollten stattdessen' NgResourceMock.prototype' verwenden. Es löst nur diesen Fehler. Zum Spotten können Sie [dieses Tutorial] (https://scotch.io/tutorials/testing-angularjs-with-jasmine-and-karma-part-1) verwenden – fingerpich

Antwort

4

Ich weiß nicht, ob dies hilfreich sein kann, aber wenn Sie versuchen, asynchrone Operationen in Ihren Tests zu bewerten, können Sie die Methode done() in Jasmine verwenden.

Wie pro ihre Dokumentation:

beforeEach(function(done) { 
    setTimeout(function() { 
     value = 0; 
     done(); 
    }, 1); 
}); 

von done als Parameter des beforeEach Rückruf vorbei, jeder Testlauf nach der vor jeder wartet, bis die done() Funktion aufgerufen wurde.

Quelle: Jasmine (Abschnitt für asynchrone Unterstützung).

Hoffe, das hilft.

2

Hier ist die Lösung für Ihr Problem.

Der Fehler TypeError: 'undefined' is not an object (evaluating 'context.prototype.$promise') wird verursacht, wenn Sie versuchen, das Zusicherungsobjekt aufzurufen, bevor Sie die Funktion aufrufen, in der die übergeordnete Funktion definiert ist.

Hier ruft die returnValue(ngResourceMock) direkt die Funktion auf, ohne dass der Kontext und die Parameter definiert werden müssen.

Daher können Sie versuchen, eine andere beforeEach Anweisung hinzufügen wie

beforeEach(angular.mock.module(app)); 

App Modul

Hier laden kann das gleiche Konzept, um Ihr Problem another link here.

es Ihnen helfen, Hoffnung bezogen sein kann ein bisschen.