使用Restangular嵌套承诺进行AngularJS单元测试

时间:2014-08-19 17:00:57

标签: angularjs unit-testing restangular

我正在测试我的指令,该指令在控制器中使用Restangular进行一些API调用。

对于Restangular使用的promises函数,我正在嘲笑这些函数并将我的主模型放在一起,如下所示:

    model = {
        comments: comments,

        one: function () {
            deferred = $q.defer();

            return deferred.promise;
        },
        post: function () {
            deferred = $q.defer();

            return deferred.promise;
        },
        remove: function () {
            deferred = $q.defer();

            return deferred.promise;
        }
    };

因此在执行运行Restangular函数的函数时,例如:

    $scope.model.post('comments', newComment).then(...);

我自己决定拒绝或解决它:

    deferred.reject();
    $scope.$digest();

一切正常,但是当函数嵌套时却没有,例如像这样:

    $scope.model.one('comments', comment.id).remove().then(...);

在这种情况下,我收到一个错误,删除未定义(虽然我已定义):

    TypeError: 'undefined' is not a function (evaluating '$scope.model.one('comments', comment.id).remove()')

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

你的函数'one'返回一个promise而不是模型本身。函数'remove'在模型上但不在promise上。你可以使用'then'链接promise,但是你不能链接你的模型函数。

此代码:

$scope.model.one('comments', comment.id).remove().then(...);

相当于:

var promise = $scope.model.one('comments', comment.id);
promise.remove(); // error: 'remove' is undefined!

你的代码的另一个问题是你定义延迟对象,并返回promises(这很好),但你永远不会通过调用延迟对象的'resolve'或'reject'函数来'解析'或'拒绝'你的promise