在AngularJS上使用mocha(无e2e测试)的单元测试服务$timeout永不结束

在AngularJS上使用mocha(无e2e测试)的单元测试服务$timeout永不结束,angularjs,karma-runner,angularjs-timeout,karma-mocha,Angularjs,Karma Runner,Angularjs Timeout,Karma Mocha,我有一个服务需要通过AJAX调用数据库,这是对它的测试: 描述“Cep服务”,-> cep=未定义 $timeout=未定义 每个之前(模块(“cep”)) 每次之前(注入($cep,$injector)-> cep=$cep $timeout=$injector.get(“$timeout”) )) 每次之后(-> $timeout.verifyNoPendingTasks() ) 它“应该失败”(完成)-> cep( '00000000' (数据)-> 期望(-> 抛出新错误('Shoul

我有一个服务需要通过AJAX调用数据库,这是对它的测试:

描述“Cep服务”,->
cep=未定义
$timeout=未定义
每个之前(模块(“cep”))
每次之前(注入($cep,$injector)->
cep=$cep
$timeout=$injector.get(“$timeout”)
))
每次之后(->
$timeout.verifyNoPendingTasks()
)
它“应该失败”(完成)->
cep(
'00000000' 
(数据)->
期望(->
抛出新错误('Shouldnt success')
).to.not.throwerr()
回来
(呃)->
expect(err).to.be.ok()
expect(err).to.be('CEP inválido'))
完成()
回来
)
尝试
$timeout.flush()
抓住e
console.log e
回来
它“应该与破折号一起使用”(完成)->
cep(
'91010-000'
(数据)->
expect(data).to.be.ok()
expect(data).to.have.property('resultado'))
expect(data).to.have.property('uf'))
expect(data).to.have.property('cidade'))
expect(data).to.have.property('bairro'))
expect(data).to.have.property('tipo_logradouro'))
expect(data).to.have.property('logradouro'))
完成()
回来
(呃)->
期望(->
抛出新错误('Shouldnt fail')
).to.not.throwerr()
完成()
回来
)
尝试
$timeout.flush()
抓住e
console.log e
回来
它“应该在没有破折号的情况下工作”(完成)->
cep(
'91010000'
(数据)->
expect(data).to.be.ok()
expect(data).to.have.property('resultado'))
expect(data).to.have.property('uf'))
expect(data).to.have.property('cidade'))
expect(data).to.have.property('bairro'))
expect(data).to.have.property('tipo_logradouro'))
expect(data).to.have.property('logradouro'))
完成()
回来
(呃)->
期望(->
抛出新错误('Shouldnt fail')
).to.not.throwerr()
完成()
回来
)
尝试
$timeout.flush()
抓住e
console.log e
回来
失败并出现错误(因为从未调用mocha的
done
):

我是否调用
$timeout.flush
并不重要。当我在调用后调用
$timeout.flush
时(因为AJAX还没有返回),它会抛出一个错误并记录到控制台
没有要刷新的延迟任务

我已经在我的
karma.conf.js
中加载了
angular mocks.js
,它们是相同的版本(angular和mock,使用
bower update
保持最新)

在CEP服务内部,调用ajax后,回调在
$timeout(->cb(data))
内执行,并且从不出于任何原因调用。我被难住了

我在SO中看到的所有问题都与e2e、jasmine和使用
$httpBackend
mock的同步测试有关。我需要为测试调用PHP脚本。另外,我在
karma.conf.js

代理:{
“/planos”:”http://local.gap/planos',
“/ajax”:”http://local.gap/ajax'
},
dev tools控制台显示请求正在完成,但在
$timeout

angular.module('cep',['pheryResource']))
.工厂(
“$cep”
[“$pheryResource”,(ajax)->
(cep、cb、err)->
cep=cep?.replace/[^0-9]*/g''
如果不是cep?或cep长度<8
错误?('CEP inválido')
回来
ajax('cep','/ajax')。获取(
{cep:cep}
(数据)->
如果不是data?或不是data.resultado?
错误?('CEP inválido')
其他的
cb(数据)
回来
(错误)->
错误?(错误)
回来
)
回来
]
)
angular.module('pheryResource',[])
.工厂(
“$pheryResource”
['$timeout',($timeout)->
phery_remote=(远程,url)->
@element=phery.element(远程,如果为url,则为{target:url}否则未定义)
angular.extend@,@element.phery()
回来
事件=(元素、cb、err)->
元素。off('phery:json phery:fail')。on(
'phery:json':(事件、数据)->
$timeout(->
cb?(数据)
回来
)
回来
'phery:fail':(事件,错误)->
$timeout(->
错误?(错误)
回来
)
回来
)
phery_remote::get=(数据、cb、错误)->
@element.phery('data','method','GET')
事件(@element,cb,err)
@element.phery('1',数据)
phery_remote::post=(数据、cb、错误)->
@element.phery('data','method','POST')
事件(@element,cb,err)
@element.phery('1',数据)
phery_remote::put=(数据、cb、错误)->
@element.phery('data','method','PUT')
事件(@element,cb,err)
@element.phery('1',数据)
phery_remote::delete=(数据、cb、错误)->
@element.phery('data','method','DELETE')
事件(@element,cb,err)
@element.phery('1',数据)
(远程,url)->
新phery_remote(远程,url)
]
)

您能添加调用
$timeout
的位置吗?@hassassin更新了帖子。请注意,代码在页面上工作,但在testsYeah中不工作,因此您指出了问题,ajax在调用flush时没有响应,因此您需要模拟调用以便它立即响应,或者尝试使用waitsFor并运行。我使用的是Mocha而不是jasmine。Mocha使用
done
回调来指示这是一个同步测试,它已经完成了。。。
Chrome 33.0.1750 (Windows 7) Cep service should fail FAILED             
    Error: timeout of 2000ms exceeded
        at C:/project/node_modules/mocha/mocha.js:4290:14