【问题标题】:AngularJS: test $scope methods that make async callsAngularJS:测试进行异步调用的 $scope 方法
【发布时间】:2014-02-14 22:26:27
【问题描述】:

我正在尝试测试我在 $scope 上的控制器方法。该方法进行异步调用并返回承诺。当 promise 被解析时,结果被赋值给 $scope 上的一个变量。

我试图提出的测试很简单:将 null 分配给 $scope 变量,调用方法,等待调用完成,期望将结果分配给 $scope 变量。

由于某种原因,承诺永远不会解决。见http://plnkr.co/edit/qxs5Y54NvhA24Fk4MPv2?p=preview

这里是控制器方法:

$scope.getSomething = ->
      someFactory.find().then (response) ->
        $scope.newValues = response.data

现在我正在尝试测试它:

  it 'should get something', ->
    scope.newValues = {}
    scope.getSomething()
    expect(scope.newValues.someData).toBeDefined()

出于单元测试的目的,我正在使用 $q.when() 方法模拟“someFactory”,据我所知,该方法在传递对象时应该立即解决。这里真的不需要等待。这是模拟工厂:

mockSomeFactory = ($q) ->
  {
    find: ->
      $q.when {someData: true}
  }

并使用 $provide 将其注入控制器:

  beforeEach module 'myAngularApp', ($provide) ->
    $provide.factory "someFactory", mockSomeFactory
    return

我尝试使用 Jasmine 的运行、​​等待和 waitsFor 方法,但没有成功。 WaitsFor 总是会失败,即使在 5000 毫秒之后也是如此。见http://plnkr.co/edit/s2OL56jVCRK0Ecyycoz0?p=preview

以前有人遇到过这种情况吗?

【问题讨论】:

    标签: angularjs unit-testing asynchronous jasmine promise


    【解决方案1】:

    角度承诺仅在摘要周期内解决。 如果你调用 $rootScope.apply() 承诺应该解决。

    root.$apply()
    expect(scope.newValues.data).toBeDefined()
    

    您还需要更改变量的名称:我更新了代码http://plnkr.co/edit/dB6zTpZ1jYXOO1kGAYvb?p=preview

    使用数据保持一致。

        $scope.newValues.data = response.data
    
    # mock factory
    mockSomeFactory = ($q) ->
    {
      find: ->
        $q.when {data: true}
    }
    

    希望对你有帮助

    【讨论】:

    • 成功了!非常感谢。也感谢您修复 plunkr。我现在要阅读有关 rootScope 和 $apply() 的文档。
    • 没问题。您可能还应该查看 $q 文档,对此的解释可以在这里看到:docs.angularjs.org/api/…
    • 谢谢。实际上,我能够让特定的单元测试只使用 scope.$digest() 而不是 root.$apply()。
    • 其实正如@Blaiz 所说,触发摘要循环的正确方法是使用$digest 函数。
    • 来自 $scope 上的文档:通常,您不会在控制器或指令中直接调用 $digest()。相反,您应该调用 $apply()(通常在指令中),这将强制执行 $digest()。我认为两者都适合测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多