JEST测试超时,手动测试工作正常

wfypjpf4  于 2022-10-22  发布在  Jest
关注(0)|答案(2)|浏览(392)

我正在尝试使用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)
tp5buhyn

tp5buhyn1#

您的createUser花费的时间超过5秒,这是JEST中的默认超时。
以增加仅用于单个测试的超时,作为对测试函数的第三个参数。
更多信息请点击此处:jset setTimeout per test

test('createUser: Non empty input should create account and return true', async () => {
    const data = await register.createUser('johnsmith1', 'smithjohn');
    expect(data).toBe(true);
}, 10000); // Jest will wait 10000 ms

为了增加全局超时,您可以阅读以下内容
configure-jest-timeout-once-for-all-tests

lb3vh1jj

lb3vh1jj2#

感谢马雷克·罗兹穆斯。
解决方案是,我需要使用模拟来返回伪数据,而不是使用对Mongoose的调用。
在模拟了这些电话之后,测试按预期进行了。我还了解了如何制定更好的测试--我们不是在测试Mongoose,而是测试我们的代码是否能够处理Mongoose可能返回的内容(成功、错误、超时等)。

相关问题