AngularJS:测试$范围的方法,使异步调用(AngularJS: test $scope me

2019-10-28 16:20发布

我想测试一个控制器方法我在$范围。 该方法使一个异步调用,并得到一个承诺回来。 当承诺解决,结果被分配给在$范围的变量。

我试图想出测试很简单:null分配到$范围变量,调用该方法,等待调用完成,预计结果将被分配到$ 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()

对于单元测试的目的,我嘲笑“someFactory”使用它,只要我相信,当传递的对象,应该立即解决$ q.when()方法。 真的没有需要在这里等待。 这是模拟工厂:

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

并且将其注入控制器使用$提供:

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

我试图用茉莉花的运行,等待和waitsFor方法,但没有运气。 WaitsFor总是失败,即使经过5000毫秒。 见http://plnkr.co/edit/s2OL56jVCRK0Ecyycoz0?p=preview

没有人有此之前发生的呢?

Answer 1:

角承诺摘要周期中只得到解决。 如果你调用$ rootScope.apply()的承诺应能解决。

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

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

使用的数据是consitant。

    $scope.newValues.data = response.data

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

希望这可以帮助



文章来源: AngularJS: test $scope methods that make async calls