Wie kann ich Spion auf einem Eckigen Versprechen Kette mit Jasmin

Verwendung von AngularJS, CoffeeScript und Jasmin (bearbeitet in WebStorm), würde ich gern unit-Tests eine Kette von Versprechungen.

Können sagen, ich habe das folgende Beispiel service:

Angular Service

class ExampleService
    stepData: []
    constructor: (@$http) ->

    attachScopeMethod: (@scope) ->
        @scope.callSteps = => @step1().then -> @step2()

    step1: ->
        @$http.get('app/step/1').then (results) =>
            @stepData[0] = results.data
            results

    step2: ->
        @$http.get('app/step/2').then (results) =>
            @stepData[2] = results.data
            results

Dieser service ermöglicht es mir, zu befestigen, die Methode callSteps() zu dem Bereich. Diese Methode, wenn Sie aufgerufen, führt eine Reihe von asynch $http-Aufrufe zu einer 3rd-party-API.

Testen, dass jeder Schritt ist zumindest genannt, habe ich Folgendes geschrieben Jasmine spec.

Jasmine Spec

ddescribe 'ExampleService', ->

    beforeEach ->
        module 'myApp'

    beforeEach inject ($rootScope, $injector) ->
        @scope = $rootScope.$new()
        @exampleService = $injector.get 'exampleService'
        @q = $injector.get '$q'

    describe 'process example steps', ->
        beforeEach  -> 
            @exampleService.attachScopeMethod(@scope)

        it "should attach the scope method", ->
            expect(@scope.callSteps).toBeDefined()

        describe 'when called should invoke the promise chain', ->

        it "should call step1 and step2", ->
            defer = @q.defer()
            @exampleService.step1 = jasmine.createSpy('step1').andReturn(defer.promise)

            @exampleService.step2 = jasmine.createSpy('step2')

            @scope.callSteps()
            defer.resolve()

            expect(@exampleService.step1).toHaveBeenCalled()
            expect(@exampleService.step2).toHaveBeenCalled()

Die Ergebnisse dieses Tests ist wie folgt:

  • erwarten(@exampleService.Schritt 1).toHaveBeenCalled() - PASS
  • erwarten(@exampleService.step2).toHaveBeenCalled() - SCHEITERN

Können Sie mir sagen, wie ich bekommen kann step2() zu erfolgreich führen im test?

Danke

BEARBEITEN

@Dashu unten freundlicherweise die Antwort auf das problem. Der trick ist, rufen Sie einfach scope.$apply oder scope.$digest auslösen, die Versprechen chain-Auflösung.

So, hier ist der working test-fragment.

describe 'when called should invoke the promise chain', ->
    it "should call step1 and step2", ->
        defer = @q.defer()
        defer.resolve()

        @exampleService.step1 = jasmine.createSpy('step1').andReturn(defer.promise)
        @exampleService.step2 = jasmine.createSpy('step2')

        @scope.callSteps()
        @scope.$apply()

        expect(@exampleService.step1).toHaveBeenCalled()
        expect(@exampleService.step2).toHaveBeenCalled()
InformationsquelleAutor biofractal | 2013-10-28
Schreibe einen Kommentar