我的开玩笑没有像我期望的那样工作。见:
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();
},
};
基本上没有调用expect(content).toEqual ...
中res.send
之后的所有内容。我觉得很困惑。我没有收到任何错误,除非我的测试花费的时间太长(因为done
)没有被调用且测试没有“关闭”。所以我的问题是,我明显错过了什么吗?
答案 0 :(得分:-1)
以下应该可以正常工作。我添加了异步,因为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.
}
);
发送抛出错误但发送由您的模拟调用,由快递here调用。所以表达捕获异常,然后结束here(done
不仅仅是你的回调)。
所以它会调用你的回调并出现错误,从jist中跳过done
并且不抛出任何东西(可能在日志中显示某些内容)。由于你的回调没有做任何事情,它会超时。
你可以尝试在回调中(done
)从jist中调用console.error(err.message);
。
<强> [UPDATE] 强>
小心翼翼地尝试捕捉expect
以下引发的错误将告诉我1次测试通过:
test('(async) fail', done => {
try{
expect(true).toBe(false);
}catch(e){
}
done();
});