我有这个异步函数用于轮询状态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