Javascript 在AngularJS控制器规范中测试来自服务的回调
我有一个控制器,它使用的服务在成功时具有回调函数 控制器功能Javascript 在AngularJS控制器规范中测试来自服务的回调,javascript,angularjs,mocking,jasmine,Javascript,Angularjs,Mocking,Jasmine,我有一个控制器,它使用的服务在成功时具有回调函数 控制器功能 itemCtrl.save = function () { ItemService.save({ username: SessionService.getUsername() }, itemCtrl.item, function (res) { $scope.$emit('UPDATE_ITEMS'); $modalInstance.close(res); }); }; 规格 当我在k
itemCtrl.save = function () {
ItemService.save({ username: SessionService.getUsername() }, itemCtrl.item, function (res) {
$scope.$emit('UPDATE_ITEMS');
$modalInstance.close(res);
});
};
规格
当我在karma中运行这个测试时,它失败了,因为没有调用modalinstance的close函数。我认为问题出在规范描述上,因为该功能在应用程序中运行。
关于这一点,我有几个问题:
- 这是描述控制器中服务调用回调的最佳方式吗
- 我应该如何使用回调描述我的规范
itemCtrl.save = function () {
ItemService.save({ username: SessionService.getUsername() }, horas.trabajo).$promise.then(function (res) {
$scope.$emit('UPDATE_ITEMS');
$modalInstance.close(res);
});
};
我想我没有通过测试,因为我的服务没有返回承诺(它有一个承诺属性,我调用该属性来发出事件并关闭modalInstance)。但我仍然对如何使用ng资源返回承诺感到困惑
我试图解决的是返回一个带有$PROMITE属性的对象,该属性包含q提供的承诺
规格
您混淆了承诺和回调的概念,但要使其按当前的方式工作,您可以使用以下方法:
spyOn(itemSrv, 'save').and.callFake(function (params, callback) {
callback({some: 'response'});
});
回拨
您传入一个将根据场景调用的函数
允诺
获取一个对象,该对象上包含一个方法(然后),该方法将在成功时调用第一个参数,或在出错时调用第二个参数
两者都有更多,但这只是一个总体概述
另外,我建议更改服务中的
save
方法以返回承诺,而不是接受回调。如果我更改并返回承诺,我应该能够像在问题中一样进行测试,对吗?是的,您那里的测试代码应该是Sami,我在第一篇文章的底部添加了我解决问题的尝试,我想我对承诺和ng资源有点困惑了。
it('should close the modal on successful save', function () {
spyOn(itemSrv, 'save').and.callFake(function () {
deferred = q.defer();
deferred.resolve();
return {$promise: deferred.promise};
});
spyOn(modalInst, 'close').and.callThrough();
ItemCtrl.save();
scope.$digest();
expect(modalInst.close).toHaveBeenCalled();
});
spyOn(itemSrv, 'save').and.callFake(function (params, callback) {
callback({some: 'response'});
});