gpt4 book ai didi

javascript - 开 Jest 期望之后的一切都没有被调用

转载 作者:行者123 更新时间:2023-11-28 20:16:44 25 4
gpt4 key购买 nike

我的 Jest 没有像我预期的那样工作。参见:

const res = {
send: (content) => {

expect(content).toEqual({
app_status: 501,
errors: {
jwt: {
location: 'body',
param: 'jwt',
value: undefined,
msg: 'The jwt is required'
}
}
});

console.log("after expect");

done();

},
};

基本上 res.send 中的 expect(content).toEqual ... 之后的所有内容都不会被调用。我觉得这很令人困惑。除了我的测试花费的时间太长(因为 done)没有被调用并且测试没有“关闭”之外,我没有收到任何错误。所以我的问题是,我是否明显遗漏了什么?

最佳答案

以下应该可以正常工作。我添加了异步,因为 send 可能被异步调用:

const createResponse = () => {
var resolve;
const p = new Promise(
(r,reject)=>resolve=r
);
return [
{
send: (value) => {
resolve(value)
}
},
p
];
};

test('(async) fail', done => {
//Router
const router = express.Router();
//Endpoint to fetch version
router.get('/api/version', (req, res) => {
setTimeout(x=>res.send('v1'),10)
});
const request = {
method: 'GET'
};
let [response,p] = createResponse()
router.stack[0].handle(request, response, () => {});
p.then(
x=>expect(x).toBe('v2'),
reject=>expect("should not reject").toBe(reject)
).then(
x=>done()
//,x=>done() //this will cause all tests to pass
);
});

在评论中回答你的问题;考虑以下代码:

const express = require('express');

const router = express.Router();
//Endpoint to fetch version
router.get('/api/version', (req, res) => {
res.send("Hello World");
});
const request = {
method: 'GET'
};
const response = {
send: (value) => {
debugger;//pause here and see the stack
throw new Error("Hello Error.");
}
};
router.stack[0].handle(
request,
response,
//this is the function done in route.js:
// https://github.com/expressjs/express/blob/master/lib/router/route.js#L127
err => {
console.error(err.message);//console errors Hello Error.
}
);

Send 抛出一个错误,但是 send 被你的 mock 调用,它被 express here 调用.所以 express 捕获异常然后结束 here (done 不仅仅是来自您的回调)。

因此它会调用您的回调并返回一个错误,从 jist 跳过 done 并且不抛出任何东西(可能会在日志中显示一些东西)。由于您的回调不执行任何操作,因此超时。

您可以尝试在回调中从 jist 调用 done(在 console.error(err.message);)。

[更新]

仔细 try catch expect 抛出的错误,以下将告诉我 1 个测试已通过:

test('(async) fail', done => {
try{
expect(true).toBe(false);
}catch(e){

}
done();
});

关于javascript - 开 Jest 期望之后的一切都没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47430565/

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