我用AngularJs编写了一个Factory,它有一个返回http promise的方法。
'use strict'
angular.module('projDefinitApp')
.factory 'testService', ($http) ->
{ getTest: (testID) ->
$http.get "temp/test.json"
}
我在使用业力和茉莉花进行测试时遇到了一些问题。承诺没有返回任何结果。我尝试创建一个var,然后调用该函数并更改var的值。但它没有更新价值:
'use strict'
describe 'Service: testService', ->
# load the service's module
beforeEach module 'projDefinitApp'
# instantiate service
testService = {}
beforeEach inject (_testService_) ->
testService = _testService_
it 'should do something', ->
retrieved = undefined
testService.getTest().success ($data,retrieved) ->
retrieved = $data
return
expect(retrieved).toBe(null)
return
return
控制台出口如下所示
PhantomJS 1.9.8(Linux)服务:testService应该做一些失败的事情
预期未定义为null。
答案 0 :(得分:2)
在测试中,Angular不会立即执行$http
服务发出的请求。原因是所有请求都排队等待在Angular生命周期的$digest
阶段运行。您需要在测试中手动运行Angular的摘要周期,方法是调用$rootScope.$apply()
或$httpBackend.flush()
,这将在内部进行调用。
我在当前测试中看到的一个问题是测试不能异步工作,不能保证在调用期望之前设置retrieved
,因为promises是异步解析的。您重写测试以使其异步工作:
it 'should do something', (done) ->
testService.getTest().success ($data) ->
expect($data).toBe(null)
done()
return
$rootScope.$apply()
return
return