0

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)
    ]
  )
4

0 に答える 0