AJAX を介してデータベースを呼び出す必要があるサービスがあり、これはそのテストです。
describe 'Cep service', ->
cep = undefined
$timeout = undefined
beforeEach(module('cep'))
beforeEach(inject(($cep, $injector)->
cep = $cep
$timeout = $injector.get('$timeout')
))
afterEach(->
$timeout.verifyNoPendingTasks()
)
it 'should fail', (done) ->
cep(
'00000000'
(data) ->
expect(->
throw new Error('Shouldnt succeed')
).to.not.throwError()
return
(err) ->
expect(err).to.be.ok()
expect(err).to.be('CEP inválido')
done()
return
)
try
$timeout.flush()
catch e
console.log e
return
it 'should work with dashes', (done) ->
cep(
'91010-000'
(data) ->
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')
done()
return
(err) ->
expect(->
throw new Error('Shouldnt fail')
).to.not.throwError()
done()
return
)
try
$timeout.flush()
catch e
console.log e
return
it 'should work without dashes', (done) ->
cep(
'91010000'
(data) ->
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')
done()
return
(err) ->
expect(->
throw new Error('Shouldnt fail')
).to.not.throwError()
done()
return
)
try
$timeout.flush()
catch e
console.log e
return
エラーで失敗します(モカ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
私が電話する$timeout.flush
かどうかは問題ではありません。呼び出し$timeout.flush
の後に呼び出すと (AJAX がまだ返されていないため)、エラーがスローされ、 console にログが記録されNo deferred tasks to flush
ます。
私はすでにロードangular-mocks.js
してkarma.conf.js
おり、それらは同じバージョンです(角度とモック、を使用して最新の状態に保たれていますbower update
)。
CEP サービス内では、ajax が呼び出された後、コールバックが a 内で実行され$timeout(-> cb(data))
、何らかの理由で呼び出されることはありません。私は困惑しています。
ここ SO で見たすべての問題は、e2e、ジャスミン、および$httpBackend
モックを使用した同期テストに関連しています。テストのために実際に PHP スクリプトを呼び出す必要があります。また、「プロキシ」をオンに設定しましたkarma.conf.js
proxies : {
'/planos': 'http://local.gap/planos',
'/ajax' : 'http://local.gap/ajax'
},
開発ツール コンソールは、リクエストが実行されていることを示していますが、停止しています。$timeout
angular.module('cep', ['pheryResource'])
.factory(
'$cep'
['$pheryResource', (ajax) ->
(cep, cb, err) ->
cep = cep?.replace /[^0-9]*/g, ''
if not cep? or cep.length < 8
err?('CEP inválido')
return
ajax('cep', '/ajax').get(
{cep: cep}
(data) ->
if not data? or not data.resultado?
err?('CEP inválido')
else
cb(data)
return
(error) ->
err?(error)
return
)
return
]
)
angular.module('pheryResource', [])
.factory(
'$pheryResource'
['$timeout', ($timeout) ->
phery_remote = (remote, url) ->
@element = phery.element(remote, if url then {target: url} else undefined)
angular.extend @, @element.phery()
return
event = (element, cb, err) ->
element.off('phery:json phery:fail').on(
'phery:json': (event, data) ->
$timeout(->
cb?(data)
return
)
return
'phery:fail': (event, error) ->
$timeout(->
err?(error)
return
)
return
)
phery_remote::get = (data, cb, err) ->
@element.phery('data', 'method', 'GET')
event(@element, cb, err)
@element.phery('one', data)
phery_remote::post = (data, cb, err) ->
@element.phery('data', 'method', 'POST')
event(@element, cb, err)
@element.phery('one', data)
phery_remote::put = (data, cb, err) ->
@element.phery('data', 'method', 'PUT')
event(@element, cb, err)
@element.phery('one', data)
phery_remote::delete = (data, cb, err) ->
@element.phery('data', 'method', 'DELETE')
event(@element, cb, err)
@element.phery('one', data)
(remote, url) ->
new phery_remote(remote, url)
]
)