Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 控制器jasmine中服务的测试.成功与错误_Angularjs_Unit Testing_Jasmine_Angular Services_Angular Controller - Fatal编程技术网

Angularjs 控制器jasmine中服务的测试.成功与错误

Angularjs 控制器jasmine中服务的测试.成功与错误,angularjs,unit-testing,jasmine,angular-services,angular-controller,Angularjs,Unit Testing,Jasmine,Angular Services,Angular Controller,我在控制器中调用了服务函数。下面是代码 服务 (function () { 'use strict'; angular.module('MyApp') .service('MyService', ['$http', function ($http) { return { getMyData: function (extension) {

我在控制器中调用了服务函数。下面是代码

服务

(function () {
'use strict';
angular.module('MyApp')
    .service('MyService', ['$http', function ($http) {                                                  
        return {
            getMyData: function (extension) {                                        
                return $http.get('www.something.com');
            }                
        };
    }])
})();
控制器

var getMyData = function () {
            MyService.getMyData(extension).success(function (results) {
                //Some functionality here
            })
                .error(function (err, status) {
                //Some functionality here
            });
        }
$scope.Call=function(){
    getMyData();
}
$scope.Call();
angular.module('MyApp', []);

angular.module('MyApp')
.service('MyService', ['$http', function ($http) {                                                  
    return {
        getMyData: function (extension) {                                        
            return $http.get('www.something.com');
        }                
    };
}]);

angular.module('MyApp')
.controller('MyAppController', ['$scope', function($scope){
    var extension = { foo: 'bar' };
    var getMyData = function () {
        MyService.getMyData(extension).then(function (results) {
            //Some functionality here
        }, function (err, status) {
            //Some functionality here
        });
    }
    $scope.Call=function(){
        getMyData();
    }
    $scope.Call();
}]);
现在请告诉我如何模拟服务呼叫(可能是与提供商)。如何在完整的代码覆盖范围内测试上述函数

我的规范文件:

$provide.service("MyService", function () {
            this.getMyData= function () {
                var result = {
                    success: function (callback) {
                        return callback({ ServerFileName: "myserverfilename"});
                    },
                    error: function (callback) {
                        return callback({ ServerFileName: "myserverfilename" });
                    }
                };
                return result;
}           

//......
my controller initiation and other code
此代码没有覆盖错误块并给出错误

Cannot read property 'error' of undefined
请帮助我如何在规范文件中编写/模拟我的服务的getMyData函数


提前感谢。

您需要使用spyon,它会为您的服务创建某种模拟。您需要在测试文件中执行此操作。请检查以下代码:

spyOn(MyService, "getMyData").and.callFake(() => {
            return {
                error: (callback) => {
                    return callback({});
                }
            };
        });

希望我回答了你的问题

你需要使用spyon,它会为你的服务创建某种模拟。您需要在测试文件中执行此操作。请检查以下代码:

spyOn(MyService, "getMyData").and.callFake(() => {
            return {
                error: (callback) => {
                    return callback({});
                }
            };
        });

希望我回答了你的问题,因为
。success
。error
都很旧,已经被
取代。然后(successCallback,errorCallback)
,您应该考虑替换您的链式<代码>。成功< /COD>和<代码>。错误调用一个调用“<代码>”。然后使用两个回调作为参数的第一个调用:< /代码>方法:首先是成功回调,第二个是错误回调。< /P> 如果这是您愿意做的,下面是您的工作示例:

模块、服务和控制器

var getMyData = function () {
            MyService.getMyData(extension).success(function (results) {
                //Some functionality here
            })
                .error(function (err, status) {
                //Some functionality here
            });
        }
$scope.Call=function(){
    getMyData();
}
$scope.Call();
angular.module('MyApp', []);

angular.module('MyApp')
.service('MyService', ['$http', function ($http) {                                                  
    return {
        getMyData: function (extension) {                                        
            return $http.get('www.something.com');
        }                
    };
}]);

angular.module('MyApp')
.controller('MyAppController', ['$scope', function($scope){
    var extension = { foo: 'bar' };
    var getMyData = function () {
        MyService.getMyData(extension).then(function (results) {
            //Some functionality here
        }, function (err, status) {
            //Some functionality here
        });
    }
    $scope.Call=function(){
        getMyData();
    }
    $scope.Call();
}]);
以及您的测试

describe('Controller: MyAppController', function(){
    beforeEach(module('MyApp'));
    var flag, extension, $q;
    extension = { foo: "bar" };
    beforeEach(inject(function($controller, $rootScope, _MyService_, _$q_) {
        $scope = $rootScope.$new();
        MyService = _MyService_;
        $q = _$q_;
        spyOn(MyService, 'getMyData').and.callFake(function(){
            return flag ? $q.when(): $q.reject();
        });
        MyAppController = $controller('MyAppController', {
            $scope: $scope,
            MyService: MyService
        });
    }));

    describe('function: Call', function() {
        //Text for Success Callback
        it('should implicitly call MyService.getMyData with an extension object', function() {
            flag = true;
            $scope.Call();
            expect(MyService.getMyData).toHaveBeenCalledWith(extension);
        });
        //Text for Error Callback
        it('should implicitly call MyService.getMyData with an extension object', function() {
            flag = false;
            $scope.Call();
            expect(MyService.getMyData).toHaveBeenCalledWith(extension);
        });
    });
});
更新: 我试过做这样的东西,但没有成功。由于
.error()
的调用链接到
.success()
调用,并且只有在调用了
.success()
之后才会调用该调用,因此它将永远不会到达
.error()
的调用,我们将无法模拟
.error()
。因此,如果我们尝试这样做,我们总是会得到如下错误:

无法读取未定义的属性“error”

因此,您可以使用注释
/*next*/
跳过报道中的这一部分,或者切换到
.then()


希望这能有所帮助。

因为
.success
.error
都很旧,已经被
取代。然后(successCallback,errorCallback)
,您应该考虑替换您的链式<代码>。成功< /COD>和<代码>。错误调用一个调用“<代码>”。然后使用两个回调作为参数的第一个调用:< /代码>方法:首先是成功回调,第二个是错误回调。< /P> 如果这是您愿意做的,下面是您的工作示例:

模块、服务和控制器

var getMyData = function () {
            MyService.getMyData(extension).success(function (results) {
                //Some functionality here
            })
                .error(function (err, status) {
                //Some functionality here
            });
        }
$scope.Call=function(){
    getMyData();
}
$scope.Call();
angular.module('MyApp', []);

angular.module('MyApp')
.service('MyService', ['$http', function ($http) {                                                  
    return {
        getMyData: function (extension) {                                        
            return $http.get('www.something.com');
        }                
    };
}]);

angular.module('MyApp')
.controller('MyAppController', ['$scope', function($scope){
    var extension = { foo: 'bar' };
    var getMyData = function () {
        MyService.getMyData(extension).then(function (results) {
            //Some functionality here
        }, function (err, status) {
            //Some functionality here
        });
    }
    $scope.Call=function(){
        getMyData();
    }
    $scope.Call();
}]);
以及您的测试

describe('Controller: MyAppController', function(){
    beforeEach(module('MyApp'));
    var flag, extension, $q;
    extension = { foo: "bar" };
    beforeEach(inject(function($controller, $rootScope, _MyService_, _$q_) {
        $scope = $rootScope.$new();
        MyService = _MyService_;
        $q = _$q_;
        spyOn(MyService, 'getMyData').and.callFake(function(){
            return flag ? $q.when(): $q.reject();
        });
        MyAppController = $controller('MyAppController', {
            $scope: $scope,
            MyService: MyService
        });
    }));

    describe('function: Call', function() {
        //Text for Success Callback
        it('should implicitly call MyService.getMyData with an extension object', function() {
            flag = true;
            $scope.Call();
            expect(MyService.getMyData).toHaveBeenCalledWith(extension);
        });
        //Text for Error Callback
        it('should implicitly call MyService.getMyData with an extension object', function() {
            flag = false;
            $scope.Call();
            expect(MyService.getMyData).toHaveBeenCalledWith(extension);
        });
    });
});
更新: 我试过做这样的东西,但没有成功。由于
.error()
的调用链接到
.success()
调用,并且只有在调用了
.success()
之后才会调用该调用,因此它将永远不会到达
.error()
的调用,我们将无法模拟
.error()
。因此,如果我们尝试这样做,我们总是会得到如下错误:

无法读取未定义的属性“error”

因此,您可以使用注释
/*next*/
跳过报道中的这一部分,或者切换到
.then()


希望这有帮助。

这是解决方案。我也遇到过类似的问题。看起来我们必须设计自己的代码,Jasmine允许我们设计、定制回调方法在链接中,return对象是Javascript方法链接的强制对象。使用我的解决方案不需要使用然后功能

$provide.service("MyService", function () {
            this.getMyData= function () {
                var result = {
                    success: function (callback) {
                        callback({ ServerFileName: "myserverfilename"});
                        //returning main object for error callback invoke to occur
                        return this;

                    },
                    error: function (callback) {
                        callback({ ServerFileName: "myserverfilename" });
                        //returning this object will initialize error callback with object since you are chaining
                        return this;
                    }
                };
                return result;
}           

这是解决方案。我也遇到过类似的问题。看起来我们必须设计自己的代码,Jasmine允许我们设计、定制回调方法在链接中,return对象是Javascript方法链接的强制对象。使用我的解决方案不需要使用然后功能

$provide.service("MyService", function () {
            this.getMyData= function () {
                var result = {
                    success: function (callback) {
                        callback({ ServerFileName: "myserverfilename"});
                        //returning main object for error callback invoke to occur
                        return this;

                    },
                    error: function (callback) {
                        callback({ ServerFileName: "myserverfilename" });
                        //returning this object will initialize error callback with object since you are chaining
                        return this;
                    }
                };
                return result;
}           

我应该在提供者或规范(it)中的何处编写此代码?您必须在每次编写之前编写此代码。类似这样的东西:beforeach(angular.mock.inject((MyService)=>{var}u MyService=MyService;spyOn({u MyService,“getMyData”).and.callFake(()=>{return{error:(callback)=>{return callback({});}}}当我在Beforeach中执行此操作时,会显示错误“MyService.getMyData(…).success不是一个函数”您能给我一个工作示例吗?我非常需要它!我无法测试它。我应该在哪里在提供程序或规范(it)中编写此代码?您必须在Beforeach中编写此代码。类似这样的内容:Beforeach(angular.mock.inject)((MyService)=>{var}u MyService=MyService;spyOn({u MyService,“getMyData”).and.callFake(()=>{return{error:(callback)=>{return callback({});}};}}当我在beforeach中执行此操作时,它会显示错误“MyService.getMyData(…).成功不是一种功能“你能给我一个工作示例吗?我非常需要它!我无法测试它。谢谢你的解决方案。你的意思是,如果不将成功和错误块更改为,就无法测试成功和错误块吗?我知道如何使用编写。但现在我们无法更改源代码。还有其他方法吗?谢谢你的解决方案。你的意思是如果不将成功和错误块更改为then,就无法测试成功和错误块?我知道如何使用then编写。但现在我们无法更改源代码。还有其他方法吗?