2013-12-14 124 views
3

裏面我有一個服務這個方法:AngularJS測試一個承諾被稱爲一個承諾

this.getCoords = function() { 
    var deferred = $q.defer(); 

    geolocation.getLocation().then(function(data) { // line 29 in Karma output 
    var coords = _.pick(data.coords, 'latitude', 'longitude'); 
    return deferred.resolve(coords); 
    }, function(reason) { 
    return deferred.reject(reason); 
    }); 

    return deferred.promise; 
}; 

由於geolocation本身就是一個模塊,我只是想測試geolocation.getLocation()承諾確實已被調用。

什麼我迄今所做的:

... 

geolocationGetLocationSpy = spyOn(geolocation, 'getLocation'); 

... 

describe('getCoords()', function() { 

    it('should call geolocation.getLocation()', function() { 
    Googlemaps.getCoords(); // line 64 in Karma output 

    // promise won't get resolved until a digest 
    $rootScope.$apply(); 

    expect(geolocationGetLocationSpy).toHaveBeenCalled(); 
    }); 

}); 

但是我得到:

PhantomJS 1.9.2 (Mac OS X) Service: Googlemaps getCoords() should call geolocation.getLocation() FAILED 
    TypeError: 'undefined' is not an object (evaluating 'geolocation.getLocation().then') 
     at /Users/jviotti/Projects/Temporal/angular/angular-geolocation/app/scripts/services/googleMaps.js:29 
     at /Users/jviotti/Projects/Temporal/angular/angular-geolocation/test/spec/services/googleMaps.js:64 

還有什麼應該怎麼辦?

+0

什麼是geolocationGetLocationSpy?如果我想窺探'getLocation()'方法,我會這樣做:'spyOn(goelocation,'getLocation');'在測試開始時。然後在最後你可以期待它被稱爲:'expect(geoLocation.getLocation).toHaveBeenCalled();' –

+0

'geolocationGetLocationSpy = spyOn(geolocation,'getLocation');'。將間諜分配給變量具有相同的結果。幾乎在所有的測試中都有這種模式。它應該工作。 – jviotti

回答

7

您使用的圖案看起來很好。試試這樣做:

geolocationGetLocationSpy = spyOn(geolocation, 'getLocation').andCallThrough(); 

// or the Jasmine 2.0 syntax 
geolocationGetLocationSpy = spyOn(geolocation, 'getLocation').and.callThrough(); 

當你窺探一個方法時,原始方法被一個使所有「窺探」功能工作的方法覆蓋。假冒版本getLocation()未返回與原始方法相同的值(原始方法似乎返回promise)。

爲此,您可以添加andCallThrough(),現在假冒版本getLocation()將調用原始方法以及執行「窺探」功能。

+0

按預期工作。謝謝,儘管你在最新版本中寫了'addCallThrough()'而不是'andCallThrough()' – jviotti

+0

,現在'spyOn()。和.CallThrough()' – tarrball