gpt4 book ai didi

javascript - 如何使用 jest 返回的 promise 测试函数?

转载 作者:行者123 更新时间:2023-12-01 16:17:21 25 4
gpt4 key购买 nike

这是我的功能

const FS = require('fs');
const PARSER = new $RefParser;

const dereference = (filePath)=>{
let parsedJSON = PARSER.dereference(filePath,{dereference: {circular: false}});

return parsedJSON.then(result =>{
const dereferencedJSON = JSON.stringify(result,null,2);
FS.writeFileSync(filePath,dereferencedJSON);
}).catch((error)=>{
console.log(error.message);
});
};

module.exports = {
dereferenceSchema,
PARSER
};

这里是测试

const {dereferenceSchema,PARSER} = require('../../src/dereferenceService');

describe('derefrencing service test',() =>{
it('Should throw ReferenceError if circular reference detected', done => {
beforeEach(()=>{
PARSER.dereference = jest.fn();
});
dereferenceSchema(CIRCULAR_REF_FILE).then((data) => {
console.log(data) // this gives me undefined
done();
})

});
});

我也试过

describe('derefrencing service test',() =>{

it('Should throw ReferenceError if circular reference detected', async () => {
expect.assertions(1);
return dereferenceSchema(CIRCULAR_REF_FILE).catch((e)=>{
expect(e).toEqual('ReferenceError');
}
);
});
});
//This will have Error: Expected one assertion to be called but received zero assertion calls.

上面的测试无论在什么情况下总是通过的,但是控制台中仍然有ReferenceError,这来自于我catch >derefrenceSchema 函数。

我对开 Jest 完全陌生,我尝试了不同的方法,要么使用与done()jest.fn() 一起工作的方法。

如果有人能在这里帮助我,我将不胜感激。

最佳答案

这里有几个问题需要解决。首先,从您的测试中返回 promise 以允许 Jest 框架处理它:

describe('derefrencing service test',() =>{
it('Should throw ReferenceError if circular reference detected', done => {
beforeEach(()=>{
PARSER.dereference = jest.fn();
});

// add "return" here:
return dereferenceSchema(CIRCULAR_REF_FILE).then(() => {
done();
}).catch(e => {
expect(e.name).toMatch('ReferenceError');
done();
});

});
});

其次,您不需要在测试中同时使用 .then().catch()。您应该只测试一个具有已知结果的场景。对于具有不同结果的不同输入,您应该为每个场景编写单独的测试。

第三,您的调试有证据表明 dereferenceSchema() 返回的 promise 已解决,但听起来您希望它抛出错误。这意味着 dereferenceSchema() 不正确或测试不正确。如果 dereferenceSchema() 不正确,那么您需要相应地修复它。该测试至少在两种不同的方面可能是不正确的:

  1. 设置错误,实际上并没有触发您正在测试的错误。这可能是因为 beforeEach() 的位置不正确。它应该嵌套在 describe() 中,而不是在 it() 中。 beforeEach()describe() 中的每个 it() 之前运行。当您有多个需要相同设置的测试时,这很有用。

  2. 您期望结果的方式是错误的。您可能只需要将测试更改为在 .then() 子句而不是 .catch() 子句中有期望。

关于javascript - 如何使用 jest 返回的 promise 测试函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62522540/

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