gpt4 book ai didi

unit-testing - AngularJS 测试 promise 在 promise 中被调用

转载 作者:行者123 更新时间:2023-12-04 04:11:05 25 4
gpt4 key购买 nike

我在服务中有这个方法:

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() promise 是否确实被调用了。

到目前为止我做了什么:

 ...

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

我还应该做什么?

最佳答案

您使用的模式看起来不错。尝试这样做:

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

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

当您监视一个方法时,原始方法会被一个使所有“监视”功能都起作用的方法覆盖。 getLocation() 的伪造版本没有返回与原始方法相同的值(原始方法似乎返回一个 promise)。

为此,您可以添加 andCallThrough(),现在 getLocation() 的虚假版本将调用原始方法并执行“ spy ” on”功能。

关于unit-testing - AngularJS 测试 promise 在 promise 中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20584075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com