Jasmine - 如何监视和测试 AngularJS 异步服务

Jasmine - How to Spy and test an AngularJS asynchronus Service

我正在尝试监视异步服务调用,但到目前为止还没有成功。尽管同步调用能够模拟。

commonService.getResource(ResourceConst).then(function (result) {
                $scope.resource = result.data;
            }, function (error) {
                loggerService.log(error);
});

实际获取资源函数

function getResource(resourceURL) {
            var deferred = $q.defer();
            var url = resourceURL + ".json";
            $http.get(url).then(function (data) {
                deferred.resolve(data);
            },
                function (error) {
                    deferred.reject(error);
                });
            return deferred.promise;
}

尽管我能够像下面这样在同一服务中监视同步方法,但我无法对该函数调用执行相同的操作。

spyOn(commonService, 'hasData').and.callFake(function(args) {
    return true;
});

以上代码成功完全模拟了同步调用,

$scope.hasData = commonService.hasData($scope.resource.Data);

我怎样才能return一个结果

{'name':"Name"}到异步调用getResource

由于服务应该 return 一个承诺,return 值应该用一个承诺来模拟:

spyOn(commonService, 'hasData').and.returnValue($q.resolve({'name': "Name"} ));

上面的代码使用了延迟反模式。应该改为:

function getResource(resourceURL) {
            var url = resourceURL + ".json";
            return $http.get(url);
}