我正在尝试使用Jest测试NodeJS函数。我完全是Jest的初学者,所以我认为这是我组织测试的方式中的一个问题。
当手动调用或从应用程序内部调用时,该函数运行良好。但是当从Jest测试调用时,它要么超时,返回一个空对象,要么失败。
要测试的功能:
async function createUser(username, password){
try{
const user = await UserModel.create({ username, password });
return true;
} catch(error){
if(error.code == 11000){
const field = Object.keys(error.keyValue);
const err = Error("Account with username " + field + " already exists");
throw err;
}
if(error.name == 'ValidationError'){
const err = Error("Error creating new user");
throw err;
}
const err = Error("Unknown error creating new user");
throw err;
}
}
和我创建的Jest测试:
test('createUser: Non empty input should create account and return true', async () => {
const data = await register.createUser('johnsmith1', 'smithjohn');
expect(data).toBe(true);
});
test('createUser: Duplicate user/pass should not create user and should throw error', async () => {
try{
await register.createUser('johnsmith1', 'smithjohn');
} catch(error){
expect(error).toMatch('error');
}
});
运行两个测试时超时:
createUser: Duplicate user/pass should not create user and should throw error
thrown: "Exceeded timeout of 5000 ms for a test.
Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test."
74 | });
75 |
> 76 | test('createUser: Duplicate user/pass should not create user and should throw error', async () => {
| ^
77 | try{
78 | await register.createUser('johnsmith1', 'smithjohn');
79 | } catch(error){
at Object.test (tests/register.test.js:76:1)
2条答案
按热度按时间tp5buhyn1#
您的
createUser
花费的时间超过5秒,这是JEST中的默认超时。以增加仅用于单个测试的超时,作为对测试函数的第三个参数。
更多信息请点击此处:jset setTimeout per test
为了增加全局超时,您可以阅读以下内容
configure-jest-timeout-once-for-all-tests
lb3vh1jj2#
感谢马雷克·罗兹穆斯。
解决方案是,我需要使用模拟来返回伪数据,而不是使用对Mongoose的调用。
在模拟了这些电话之后,测试按预期进行了。我还了解了如何制定更好的测试--我们不是在测试Mongoose,而是测试我们的代码是否能够处理Mongoose可能返回的内容(成功、错误、超时等)。