javascript - Hur man jämför ENOENT-fel i Jest?
Jag har följande funktion:
export const readAsync = (filename: string): Promise<object> =>
new Promise((resolve: (data: object) => void, reject: (data: Error) => void) => {
readFile(join(__dirname, `../../__mocks__/${filename}`), 'utf8', (err: Error, data: string) => {
if (err) {
reject(err);
} else {
resolve(JSON.parse(data));
}
});
});
Att jag hade skrivit i TypeScript och jag testar det i ts-jest genom:
describe('Testing readAsync function', () =>
test('filename \"undefined\".', () => {
const filePath: string = join(__dirname, '../../__mocks__/undefined');
const errorMessage: Error = new Error(`ENOENT: no such file or directory, open \'${filePath}\'`);
expect.assertions(1);
return expect(readAsync(undefined)).rejects.toMatchObject(errorMessage);
});
Men detta ger mig detta fel:
expect(received).toMatchObject(expected)
Expected value to match object:
[Error: ENOENT: no such file or directory, open '/home/farm/Documents/podsearch_bot/__mocks__/undefined']
Received:
[Error: ENOENT: no such file or directory, open '/home/farm/Documents/podsearch_bot/__mocks__/undefined']
Difference:
Compared values have no visual difference.
Jag tycker ärligt att det måste vara ett matchningsalternativ, men just nu har jag testat med:
- attMatchaObjekt
- att vara
- att_Lika
- varaInstansAv
- toThrow -- även om man vet att det inte kastar någonting
- objektSomInnehåller
- attMatcha
Men ingen verkar fungera... Hur kan jag fixa detta?
Svar #1
Ett sätt att få det att fungera är att fånga felet och jämföra koden det returnerar, med ditt exempel:
test('Should return an error', async () => {
try {
await readAsync('./nomatch/nomatch.txt');
} catch (e) {
expect(e.code).toEqual('ENOENT');
}
});
JavaScript-egenskaper kan vara icke-uppräkningsbara, vilket betyder att de inte visas i for..in-loopar eller Object.keys-resultat.
Du kanske vill veta vilka nycklar som finns på Error-objektet med Object.getOwnPropertyNames(e)
Svar #2
test('Should return an error', async () => {
expect(async() => await readAsync('./nomatch/nomatch.txt')).toThrow('ENOENT: no such file or directory, open \'./nomatch/nomatch.txt\'');
expect(async() => await readAsync('./nomatch/nomatch.txt')).toThrow(/^ENOENT.*/g);
});
När du skickar en pilfunktion som en parameter till expect, kör jest funktionen.
