gpt4 book ai didi

typescript - Jest : await vs setImmediate vs useFakeTimers vs new Promise(setImmediate)

转载 作者:行者123 更新时间:2023-12-03 20:51:57 28 4
gpt4 key购买 nike

接下来是 TypeScript 中的 Jest 测试。我想知道为什么需要 setImmediate() 。

第一个例子是一个有效的测试。接下来是我尝试过但不起作用的各种事情。我不明白发生了什么。 pubsub.publish 的签名是:(method) PubSub.publish(triggerName: string, payload: any): Promise<void>

  test.only('subscriptions', async () => {
const document = parse(`
subscription {
create
}
`)

const sub = <AsyncIterator<ExecutionResult>>await subscribe(schema, document);

expect(sub.next).toBeDefined()

// setInterval and process.nextTick also work here:
setImmediate(() => pubsub.publish('CREATE_ONE', { create: "FLUM!" })) // this works


const { value: { errors, data } } = await sub.next()

expect(errors).toBeUndefined()
expect(data).toBeDefined()
expect(data.create).toBe('FLUM!')
}, 10000)

所以这些是我尝试过的其他事情,一些是在研究了类似问题的答案之后。所有这些尝试都失败并在测试中出现超时异常:



test.only('subscriptions', async () => {
// attempt #1: jest.useFakeTimers()

const document = parse(`
subscription {
create
}
`)

const sub = <AsyncIterator<ExecutionResult>>await subscribe(schema, document);

expect(sub.next).toBeDefined()

// #1, cont:
// pubsub.publish('CREATE_ONE', { create: "FLUM!" })
// or...
// await pubsub.publish('CREATE_ONE', { create: "FLUM!" })
// this works, though, like in previous test, but with fake timers:
// setImmediate(() => pubsub.publish('CREATE_ONE', { create: "FLUM!" }))


// attempt #2:
// await pubsub.publish('CREATE_ONE', { create: "FLUM!" })

// attempt #3:
// pubsub.publish('CREATE_ONE', { create: "FLUM!" })
// await new Promise(setImmediate)

// attempt #3a (variant):
// await new Promise((resolve) => setImmediate(resolve));

const { value: { errors, data } } = await sub.next()

expect(errors).toBeUndefined()
expect(data).toBeDefined()
expect(data.create).toBe('FLUM!')
}, 10000)

我知道 setImmediate 将一个函数放入事件循环中,以便在任何挂起的 I/O 事件之后立即执行。我不确定为什么需要它,因为 pubsub.publish() 返回一个可以用 处理的 Promise等待 ,但在这种情况下会发生下一行, 等待 sub.next() 永远不会被调用。

我的想法是在 pubsub.publish() 中有一个 setInterval 调用,并且 setImmediate 等待任何挂起的 setInterval 事件完成(我对此的理解是模糊的)。尝试 3 和 3a 是我在其他地方找到的用于执行此操作的机制,但在这种情况下它们似乎不起作用。

问题:为什么这个测试需要 setImmediate 才能通过?

最佳答案

所以我的困惑是由于 setImmediate 做什么和不做什么。这是正在发生的事情:

    // setInterval and process.nextTick also work here:
setImmediate(() => pubsub.publish('CREATE_ONE', { create: "FLUM!" }))
const { value: { errors, data } } = await sub.next()
如果没有 setImmediate(),则在调用 sub.next() 之前发送发布事件,因此不会捕获它。您可能认为 setImmediate(或 process.nextTick)会导致立即执行发布函数,但不会。相反, setImmediate 延迟了足够长的发布调用,以便 sub.next() 执行。
我现在要对 setImmediate 和 process.nextTick 的实际工作方式做一些补救性阅读。

关于typescript - Jest : await vs setImmediate vs useFakeTimers vs new Promise(setImmediate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62419700/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com