Jasmine - 如何间谍和测试AngularJS异步服务

时间:2017-11-28 08:03:58

标签: angularjs jasmine karma-runner karma-jasmine

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

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);

如何返回结果

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

1 个答案:

答案 0 :(得分:1)

由于服务应该返回一个promise,因此返回值应该使用promise进行模拟:

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

上面的代码使用延迟反模式。它应该是:

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