【问题标题】:Unit testing promises triggered by $watch由 $watch 触发的单元测试承诺
【发布时间】:2021-02-19 05:00:58
【问题描述】:

我正在使用 Jasmine 来尝试和测试具有以下模式的代码:

(这本质上是一个分页的数据库表加载)

1. controller calls api on load
2. api.then updates $scope variable
3. controller $watch-es that $scope variable
  a. If new value meets criteria, call api again
  b. api.then updates $scope variable
  c. controller $watch-es the change
    i. eventually new value does not meet criteria and call chain is stopped

现在我的单元测试有 2 个延迟承诺。一个返回一个通过 $watch 检查的值,一个执行相反的操作。但是,第二个承诺的 then() 没有被调用。努力了解我需要在哪里解决承诺和$digest

查看一个简化的 plunker:https://plnkr.co/edit/543Q5vGJqTYzkSvh

我希望 $scope.$watch 方法在第二次 api 调用之后记录一些内容。

我的单元测试中缺少什么

【问题讨论】:

    标签: javascript angularjs unit-testing jasmine


    【解决方案1】:

    在搜索了有关 $watch 被触发两次的更多信息后,我发现了我的问题。这是因为我在第一个 beforeEach 中创建了模拟控制器,然后在我的 it 测试中重新创建了控制器。但我没有为新控制器创建新的$scope。因此,在加载时发生的第一个 api 调用之后,当我执行 $scope.$apply() 时,两个控制器实例都触发了 $scope.$watch 更改。

    https://stackoverflow.com/a/35842248/5362166

    我继续按照控制器创建模式here

    我的工作代码在 plunker 中:https://plnkr.co/edit/543Q5vGJqTYzkSvh

    我使用 jasmine 的 done() 函数。

    在我的测试中,我得到了我的模拟工厂的最新调用,它返回一个承诺,调用then(),在then() 内,我消化了触发我的 watch 函数的范围,这触发了第二个 api 调用。我重复这个过程,得到最近的模拟调用,调用then(),再次消化范围,最后调用done();我看到了我期待的输出。

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多