我正在尝试测试$ 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
之前有人发生过这种事吗?
答案 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}
}
希望这有帮助