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
Javascript 在AngularJS控制器规范中测试来自服务的回调_Javascript_Angularjs_Mocking_Jasmine - Fatal编程技术网

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