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.