【问题标题】:AngularJS Unit testing with Restangular - nested promisesAngularJS 单元测试与 Restangular - 嵌套承诺
【发布时间】:2014-08-19 17:00:56
【问题描述】:

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

对于 Restangular 使用的带有 Promise 的函数,我正在模拟这些函数并将其与我的主模型放在一起,如下所示:

    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(...);

在这种情况下,我收到一个错误,即 remove is not defined(尽管我定义了它):

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

我错过了什么吗?

【问题讨论】:

  • 这是什么状态?我可以帮忙吗?
  • 如果可以的话。我只是跳过了带有嵌套操作的测试,所以 .one.remove 或 .one.getList 例如不知道如何模拟...

标签: angularjs unit-testing restangular


【解决方案1】:

您的函数“one”返回一个承诺,而不是模型本身。模型上的“删除”功能,而不是承诺上的功能。您可以使用“then”链接 promise,但不能链接模型函数。

这段代码:

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

相当于:

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

您的代码的另一个问题是您定义了延迟对象并返回承诺(这很好),但您永远不会通过调用延迟对象的“解决”或“拒绝”函数来“解决”或“拒绝”您的承诺.

【讨论】:

  • 我认为 OP 会在每个测试用例中调用“解决”或“拒绝”,而不是在模拟对象本身中。
  • 你说的OP是什么意思?
  • “原始海报”,见:What does OP mean?
  • 那么如何在我的模拟中正确添加删除功能?
  • 你能通过jsfiddle或plunkr提供一个完整的例子吗?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 2016-05-01
  • 2013-02-09
  • 2014-03-05
  • 2016-10-25
相关资源
最近更新 更多