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编写。但现在我们无法更改源代码。还有其他方法吗?