Jest/SuperTest 如何在一组 promise 中正确地预期 Socket Hangup?
Jest/SuperTest how to correctly expect Socket Hangup across a set of promises?
我有一个测试说“在大约 X 个并发连接后,我应该会看到套接字挂起,因为我的服务将停止回答敲打我的人。”
经过大量痛苦的试验和错误后,这工作得很好,但因为我正在使用
await Promise.all(myrequests)
我第一次看到挂断时会抛出 socket hang up
异常。
这有效,但会导致一些错误消息,因为我的挂断例程会进行一些调试日志记录,此时测试结束。
最好的表达方式是什么:“等待所有这些,即使它们会抛出错误?”
我的 jest/supertest 问题块看起来像:
//Send enough concurrent connections to trip the dropout
for(var i = 0;MAX_CONCURRENT_CONNECTIONS+5;i++)
{
requests.push(request(app).get('/'))
}
//wait for all the connections to resolve
const t = async () => {
await Promise.all(requests);
};
//and make sure some drop off
expect(t).toThrow("socket hang up"); //this also doesn't match the error string right but that is because I'm not as experienced in this sort of thing as I'd like!
//however after this, the test ends, and my back end logging causes problems since the test is over!
什么是最好的方法来等待请求中的所有承诺,即使在 await Promise.all(requests)
上抛出也是如此?
我可以执行以下难看的代码,但我正在寻找编写此代码的正确方法:)
let gotConnReset = false
try
{
await Promise.all(requests);
}
catch(err)
{
if(err.message == "socket hang up")
{
gotConnReset = true;
}
}
assert(gotConnReset === true);
//wait for all the other requests so that Jest doesn't yell at us!
await Promise.allSettled(requests);
我不知道 Jest 有什么帮助,但有 Promise.allSettled
会等待所有承诺履行或拒绝,返回所有结果的数组。被拒绝的承诺将附加 .reason
。
主要区别在于 Jest 将匹配错误对象而不是使用抛出的错误匹配器,因此不存在某些特定于错误的功能。
test('allSettled rejects', async () => {
class Wat extends Error {}
const resError = new Wat('Nope')
resError.code = 'NO'
const res = await Promise.allSettled([
Promise.resolve(1),
Promise.reject(resError),
Promise.resolve(3),
])
expect(res).toEqual(
expect.arrayContaining([
{ status: 'rejected', reason: new Error('Nope') },
])
)
})
✓ allSettled rejects (2 ms)
如果你想避免上面示例的“松散”匹配,如果 message
匹配,它会与任何 Error
对象一起传递,它可能需要像 jest-matcher-specific-error 或expect.extend
错误匹配器
结果可以直接用filter
/map
或reduce
测试拒绝
(await Promise.allSettled())
.filter(o => o.status === 'rejected')
.map(o => o.reason)`
我有一个测试说“在大约 X 个并发连接后,我应该会看到套接字挂起,因为我的服务将停止回答敲打我的人。”
经过大量痛苦的试验和错误后,这工作得很好,但因为我正在使用
await Promise.all(myrequests)
我第一次看到挂断时会抛出 socket hang up
异常。
这有效,但会导致一些错误消息,因为我的挂断例程会进行一些调试日志记录,此时测试结束。
最好的表达方式是什么:“等待所有这些,即使它们会抛出错误?”
我的 jest/supertest 问题块看起来像:
//Send enough concurrent connections to trip the dropout
for(var i = 0;MAX_CONCURRENT_CONNECTIONS+5;i++)
{
requests.push(request(app).get('/'))
}
//wait for all the connections to resolve
const t = async () => {
await Promise.all(requests);
};
//and make sure some drop off
expect(t).toThrow("socket hang up"); //this also doesn't match the error string right but that is because I'm not as experienced in this sort of thing as I'd like!
//however after this, the test ends, and my back end logging causes problems since the test is over!
什么是最好的方法来等待请求中的所有承诺,即使在 await Promise.all(requests)
上抛出也是如此?
我可以执行以下难看的代码,但我正在寻找编写此代码的正确方法:)
let gotConnReset = false
try
{
await Promise.all(requests);
}
catch(err)
{
if(err.message == "socket hang up")
{
gotConnReset = true;
}
}
assert(gotConnReset === true);
//wait for all the other requests so that Jest doesn't yell at us!
await Promise.allSettled(requests);
我不知道 Jest 有什么帮助,但有 Promise.allSettled
会等待所有承诺履行或拒绝,返回所有结果的数组。被拒绝的承诺将附加 .reason
。
主要区别在于 Jest 将匹配错误对象而不是使用抛出的错误匹配器,因此不存在某些特定于错误的功能。
test('allSettled rejects', async () => {
class Wat extends Error {}
const resError = new Wat('Nope')
resError.code = 'NO'
const res = await Promise.allSettled([
Promise.resolve(1),
Promise.reject(resError),
Promise.resolve(3),
])
expect(res).toEqual(
expect.arrayContaining([
{ status: 'rejected', reason: new Error('Nope') },
])
)
})
✓ allSettled rejects (2 ms)
如果你想避免上面示例的“松散”匹配,如果 message
匹配,它会与任何 Error
对象一起传递,它可能需要像 jest-matcher-specific-error 或expect.extend
错误匹配器
结果可以直接用filter
/map
或reduce
测试拒绝
(await Promise.allSettled())
.filter(o => o.status === 'rejected')
.map(o => o.reason)`