AngularJS:测试进行异步调用的$ scope方法

时间:2014-01-24 03:42:40

标签: angularjs unit-testing asynchronous jasmine promise

我正在尝试测试$ 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的运行,等待并等待方法,但没有运气。即使在5000毫秒之后,WaitsFor总会失败。见http://plnkr.co/edit/s2OL56jVCRK0Ecyycoz0?p=preview

之前有人发生过这种事吗?

1 个答案:

答案 0 :(得分:0)

角度承诺仅在摘要周期中解决。 如果你调用$ 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}
}

希望这有帮助