这是我的函数
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()
不正确,则需要相应地修复它。测试可能至少在两种不同的方面不正确:
设置错误,实际上不会触发您正在测试的错误。这可能是因为
beforeEach()
位于不正确的位置。它应该嵌套在describe()
内,但不能嵌套在it()
中。beforeEach()
在describe()
中的每个it()
之前运行。当您有多个需要相同设置的测试时,这很有用。你期望结果的方式是错误的。您可能只需要更改测试,以便在
.then()
子句而不是.catch()
子句中具有期望。
通过创建用于catch
错误的另一个函数,从dereferenceSchema
函数中删除 .catch 来解决该问题。
const catchErrorFunc = (p) =>{
dereferenceSchema(p).catch((error)=>{
console.log(error.name);
return error;
});
};