在AngularJS控制器规范中测试服务的回调

时间:2015-05-26 18:11:20

标签: javascript angularjs mocking jasmine

我有一个Controller,它使用的服务在成功时具有回调功能。

控制器功能

  AND nvl(sodRow.activity_result_code, 'ASD') = 'ASD'

规范

itemCtrl.save = function () {
    ItemService.save({ username: SessionService.getUsername() }, itemCtrl.item, function (res) {
        $scope.$emit('UPDATE_ITEMS');
        $modalInstance.close(res);
    });
};

当我在业力中运行此测试时失败,因为未调用模态实例的关闭功能。我认为问题在于规范描述,因为该功能在应用程序中运行。 我对此有几个问题:

  • 这是描述控制器中服务调用回调的最佳方式吗?
  • 如何使用回调来描述我的规格?

- 编辑 -

我已经改变了我的服务电话,让他​​们按照承诺处理结果:

it('should close the modal on successful save', function () {
    spyOn(itemSrv, 'save').and.callFake(function () {
        deferred = q.defer();
        deferred.resolve();
        return deferred.promise;
    });
    spyOn(modalInst, 'close').and.callThrough();
    ItemCtrl.save();
    scope.$digest();
    expect(modalInst.close).toHaveBeenCalled();
});

我想我没有通过测试,因为我的服务没有返回一个promise(它有一个promise属性,我调用它来发出事件并关闭modalInstance)。但是我仍然对如何使用ng-resource返回一个承诺感到困惑。

我尝试解决它是返回一个带有$ promise属性的对象,该属性包含q提供的promise。

规范

itemCtrl.save = function () {
    ItemService.save({ username: SessionService.getUsername() }, horas.trabajo).$promise.then(function (res) {
        $scope.$emit('UPDATE_ITEMS');
        $modalInstance.close(res);
    });
};

1 个答案:

答案 0 :(得分:3)

你混淆了承诺和回调的概念,但为了让它像现在一样有效,你可以使用它:

model(params) { return this.store.find('course', params.course_id); }
// now `model` will always be "course" in setupController
  

回调

传入将根据场景调用的函数

  

无极

获取一个包含方法的对象(然后),它将在成功时调用第一个参数或在出错时调用第二个参数

两者都有更多,但这是概述。

另外,我建议您更改服务中的spyOn(itemSrv, 'save').and.callFake(function (params, callback) { callback({some: 'response'}); }); 方法以返回承诺,而不是接受回调。