如何使用 jest 返回的承诺测试函数?



这是我的函数

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,这来自我对derefrenceSchema函数的catch

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

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

这里有几个问题需要解决。首先,从测试中返回承诺,以允许 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()返回的承诺已解决,但听起来您希望它引发错误。这意味着dereferenceSchema()不正确或测试不正确。如果dereferenceSchema()不正确,则需要相应地修复它。测试可能至少在两种不同的方面不正确:

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

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

通过创建用于catch错误的另一个函数,从dereferenceSchema函数中删除 .catch 来解决该问题。

const catchErrorFunc = (p) =>{
dereferenceSchema(p).catch((error)=>{
console.log(error.name);
return error;
});
};

最新更新