2014-01-24 38 views
0

我试图测试我在$范围内的控制器方法。该方法进行异步调用并获得承诺。当promise被解析时,结果被分配给$ scope上的一个变量。

我试图想到的测试很简单:给$ scope变量分配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

任何人都有过这种情况?

回答

0

角度承诺只能在摘要循环中解决。 如果您调用$ rootScope.apply(),承诺应该解决。

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

使用的数据是consitant。

$scope.newValues.data = response.data 

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

希望这有助于

+0

它的工作!非常感谢你。感谢您修复plunkr。我现在要读取有关rootScope和$ apply()的文档。 – Blaiz

+0

没问题。您可能还应该查看$ q文档,这里的解释可以在这里看到:http://docs.angularjs.org/api/ng.$q#description_differences-between-kris-kowals-q-and-$ q – hassassin

+1

谢谢。我能够得到特定的单元测试,只使用scope。$ digest()实际上,而不是根。$ apply()。 – Blaiz