使用Jasmine / Karma测试异步轮询

时间:2015-11-10 02:32:44

标签: javascript testing jasmine promise karma-jasmine

我有这个异步函数用于轮询状态URL并在结果不再等待时解析一个promise。

// asynchronously poll until we get a success or failure
function pollVerificationStatus(statusUrl) {
  return fetch(statusUrl)
    .then(function(response) {
      return response.json()
    }).then(function(response) {
      if (response.status === "pending") {
        return timeoutPromise(POLL_INTERVAL_MS)
          .then(function() {
            return pollVerificationStatus(statusUrl)
          })
      } else {
        return response
      }
    })
}

它是一个非常简单的功能,但它很难测试,因为在一个承诺里面有一个setTimeout而且所有这些都是推迟的。这是我到目前为止所做的,但它不起作用..

function jsonResponsePromise(obj) {
  return new Promise(function(resolve) {
    resolve({
      json: function() {
        return new Promise(function(resolve2) {
          resolve2(obj)
        })
      }
    })
  })
}

describe("User Verification Polling", function() {
  beforeAll(function() {
    jasmine.clock().install()
    let count = 0
    spyOn(window, 'fetch').and.callFake(function() {
      count += 1
      return (count % 2 === 0) ? jsonResponsePromise({status:'ok'}) : jsonResponsePromise({status:'pending'})
    })
  })

  afterAll(function() {
    jasmine.clock().uninstall()
  })

  it("pollVerificationStatus()", function() {
    let x = pollVerificationStatus()
    jasmine.clock().tick(POLL_INTERVAL_MS+1)
    return x.then(function(response) {
      expect(window.fetch.calls.count()).toEqual(2)
    })
  })
})

好的,看了这个,我发现了一些提示,但仍然没有解决方案。

使用jasmine-promise,我可以返回异步测试的承诺。使用jasmine.clock().tick(ms),我可以控制setTimeout。但是,在演唱会中使用它们是有挑战性的,因为时钟需要在调用setTimemout时才勾选,如果必须等待整个POLL_INTERVAL_MS

,测试将失败

0 个答案:

没有答案