Jest: async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдЯреВ рдереНрд░реЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рд╕рд┐рддре░ 2016  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/jest

рдЕрдЧрд▓рд╛ рдкрд░реАрдХреНрд╖рдг

async function check() {
  throw new Error('Test');
}

expect(async () => 
  await check()
).toThrow();

рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рд╕реЗ рдирд╣реАрдВ рдкрдХрдбрд╝ рдкрд╛рдПрдЧрд╛ (рдореИрдВ рдЬреЗрд╕реНрдЯ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдХреЗ рдмрдЬрд╛рдП

expect(async () => await check()).toThrow()
// Jest error: "Expected the function to throw an error. But it didn't throw anything."

рдпрд╣ рдХрд╛рдо:

expect(check()).rejects.toEqual(new Error('Test'))

рд╣рд╛рдБ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрдЬреАрдм рд╣реИ ...

рд╕рднреА 21 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдВ, рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рджреЗрдЦреЗрдВ https://github.com/facebook/jest/issues/1377

рдХреЗ рдмрдЬрд╛рдП

expect(async () => await check()).toThrow()
// Jest error: "Expected the function to throw an error. But it didn't throw anything."

рдпрд╣ рдХрд╛рдо:

expect(check()).rejects.toEqual(new Error('Test'))

рд╣рд╛рдБ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрдЬреАрдм рд╣реИ ...

рдЖрдк рдпрд╣ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

let error;
try {
  await check();
} catch (e) {
  error = e;
}
expect(error).toEqual(new Error('Test'));

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд┐рдпрд╛:

async function check() {
  throw new Error('Test');
}

expect(check()).rejects.toEqual(new Error('Test'))

рджреЗрдЦреЗрдВ: https://facebook.github.io/jest/docs/en/tutorial-async.html#rejects

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ред
рдпрджрд┐ рдЖрдк рдореБрдЭреЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрджреЗрд╢ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ:

async function check() {
  throw new SomeSpecificError('Whatever');
}

await check()
  .then(() => {
    throw new Error('Should go to .catch, not enter .then');
  })
  .catch((err) => {
    expect(err).toBeInstanceOf(SomeSpecificError);
  });
await expect(check).rejects.toThrow(SomeSpecificError);

рд╕рд╛рде рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

await expect(check).rejects.toThrow(/DUPLICATES_DETECTED/);

рдореИрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реВрдБред

async function check() {
  throw new Error("Test");
}
await expect(check).rejects.toThrow(Error);
expect(received).rejects.toThrow()

received value must be a Promise.
Received:
 function: [Function check]

рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рджрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

async function check() {
  throw new Error("Test");
}
await expect(check()).rejects.toThrow(Error);

рд╕рд╛рде рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

it(`some test`, async () => {
  async function check() {
    try {
      return Promise.reject(await asyncMethod());
    } catch (error) {
      throw new Error("test");
    }
  }
  await expect(check()).rejects.toThrow(Error);
});

рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╕рдВрд╕реНрдХрд░рдг

  • рдордЬрд╝рд╛рдХ: 23.4.2
  • рдЯреАрдПрд╕-рдЬреЗрд╕реНрдЯ: 23.1.2

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рд╡рд╛рджреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЬрд┐рд╕ рдорд╛рдорд▓реЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдирд╣реАрдВ рд╣реИ :)

рдирдорд╕реНрддреЗ ! рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдПрд╕рд┐рдВрдХ рдХреЙрд▓ рдореЗрдВ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдирд┐рдореНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

class CustomErrorType {}
// ...
test('check throws custom error', async () => {            
    async function check() {
        throw new CustomErrorType();
    }
    await expect(check()).rejects.toThrow(CustomErrorType);
});

рддреЛ рдкрд░реАрдХреНрд╖рдг рдирд┐рдореНрди рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ:

рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреА рдЕрдкреЗрдХреНрд╖рд╛:
"рдХрд╕реНрдЯрдо рдПрд░рд░ рдЯрд╛рдЗрдк"
рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдХреБрдЫ рдирд╣реАрдВ рдлреЗрдВрдХрд╛ред

рддреЛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдЬрдмрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рд╡рд░реНрдЧ Error ред рдЬрдм рдореИрдВ Error рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ
```рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рд╡рд░реНрдЧ CustomErrorType рддреНрд░реБрдЯрд┐ рдмрдврд╝рд╛рддрд╛ рд╣реИ {}
````

рддреЛ рддреНрд░реБрдЯрд┐ рд╣реИ

рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреА рдЕрдкреЗрдХреНрд╖рд╛:
"рдХрд╕реНрдЯрдо рдПрд░рд░ рдЯрд╛рдЗрдк"
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдлреЗрдВрдХ рджрд┐рдпрд╛:
рддреНрд░реБрдЯрд┐

рдЙрд╕ рдирдореВрдиреЗ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ, рдЗрд╕ рдкрд░ рдХреЛрдИ рд╕реБрд░рд╛рдЧ? рдореИрдВ рдЬреЗрд╕реНрдЯ 23.4.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

@Marchelune рдЬрдм рдЖрдк class CustomErrorType extends Error {} рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдирдИ рдХрдХреНрд╖рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк CustomErrorType рдХреЛ рдПрдХ рдмреЙрдбреА рджреЗрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЬреЛ рд╕реБрдкрд░ () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдпрджрд┐ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рдлреЗрдВрдХрддрд╛ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рд╡рд░реНрдЧ рдФрд░ рдЙрд╕ рдзрд╛рдЧреЗ рд╕реЗ рд╕рд▓рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ (рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛)ред
toThrow() рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдореВрд▓реНрдп рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ - рддреЛ рдлреЗрдВрдХ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдпрд╣ рдбреЙрдХреНрд╕ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред
рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рднрд▓реЗ рд╣реА рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлреЗрдВрдХрддрд╛ рд╣реИ:

async function f() {throw 'aa'}
const res = await expect(f()).rejects.toThrow()`

рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ):

async function f() {throw 'aa'}
const res = await expect(f()).rejects.toBeTruthy()`

@рдХрд░рдмреБрд░ рдЯрд╛рдЗрдкреЛ toBeThruthy рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП toBeTruthy

рдпрд╣рд╛рдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЬреЛ рдЖрд╢реНрд╡рд╛рд╕рди рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

yourCoolAsyncMethod('yeah it is')
    .then(ok => { // Presumes not a Promise<void>
        expect(ok).toBeUndefined();
        done();
    })
    .catch(bad => {
        expect(bad).toBeDefined();
        expect(bad).toMatchInlineSnapshot(
            `Specifically serious error!`
        );

        done();
    });

рд╣рд╛рдп @ рд╕рд┐рдореЗрдирдмреАред
рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

async function check() {
    // do something
}
await expect(check()).rejects.toThrow(InternalServerErrorException);

рдЖрдВрддрд░рд┐рдХ рд╕рд░реНрд╡рд░ рддреНрд░реБрдЯрд┐ рдЕрдкрд╡рд╛рдж рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ....

рдореИрдВ рдХреИрд╕реЗ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рдкрд░ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛрд░ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

  • рдЕрдкрд╡рд╛рджред рд╕рдВрджреЗрд╢ = 'рддреНрд░реБрдЯрд┐'
  • рдЕрдкрд╡рд╛рджред рд╕реНрдерд┐рддрд┐ = '500'

рдпрд╣рд╛рдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЬреЛ рдЖрд╢реНрд╡рд╛рд╕рди рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

yourCoolAsyncMethod('yeah it is')
    .then(ok => {
        expect(ok).toBeUndefined();
        done();
    })
    .catch(bad => {
        expect(bad).toBeDefined();
        expect(bad).toMatchInlineSnapshot(
            `Specifically serious error!`
        );

        done();
    });

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдб рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдкрдХрд╛ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рддреЛ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рдЬрд┐рд╕ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рд╡рд╛рд╣ рдпрд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рд╡рд╛рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд╣реА рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдирд╣реАрдВ рд╣реИред

рдЕрд░реЗ @ рдбреЗрд╡рд┐рдб-рдЯреЗрдиреЗрдВрдЯ

рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЙрд╕ рд╕рдордп Promise<notVoid> рдкрджреНрдзрддрд┐ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ Promise<void> рд▓рд┐рдП рднреА рдорд╛рдиреНрдп рд╣реИред рдореИрдВрдиреЗ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЬрд╡рд╛рдм рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдореИрдВрдиреЗ рдзрд╛рд░рдгрд╛рдПрдВ рдХреА рд╣реИрдВред рдореИрдВ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

рдзрдиреНрдпрд╡рд╛рдж

рд╣рд╛рдЙрдбреА @futuredayv

рдЕрд░реЗ @ рдбреЗрд╡рд┐рдб-рдЯреЗрдиреЗрдВрдЯ

рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЙрд╕ рд╕рдордп Promise<notVoid> рдкрджреНрдзрддрд┐ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ Promise<void> рд▓рд┐рдП рднреА рдорд╛рдиреНрдп рд╣реИред рдореИрдВрдиреЗ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЬрд╡рд╛рдм рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдореИрдВрдиреЗ рдзрд╛рд░рдгрд╛рдПрдВ рдХреА рд╣реИрдВред рдореИрдВ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

рдзрдиреНрдпрд╡рд╛рдж

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рднреА рдЖрдкрдХрд╛ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдХреМрди рд╕рд╛ рдмрдЧ рд╕рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
done() рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ "рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг рдЕрдкреЗрдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЕрдкрдиреЗ рдЕрдЧрд▓реЗ рдкрд░реАрдХреНрд╖рдг рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ"

yourCoolAsyncMethod('yeah it is')
     // -- Lets say your method does not throw, and returns void instead
    .then(ok => { // Presumes not a Promise<void>
        expect(ok).toBeUndefined(); // -- At this point if it was void, this would pass
        done(); // -- Then your test would end and the catch would not be reached
        // -- Now you have unknown behavior passing a test where it's suppose to catch a fail
    })
    .catch(bad => {
        // -- This block does not run because done() is called above
        expect(bad).toBeDefined();
        expect(bad).toMatchInlineSnapshot(
            `Specifically serious error!`
        );

        done();
    });

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ done() рдХреЛ then рдХреЙрд▓ рди рдХрд░рдХреЗ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдлрд┐рд░" рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рдХрд░ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛,

yourCoolAsyncMethod('yeah it is')
    .then(ok => throw new Error("This block of code should not be reached")
    .catch(bad => {
        expect(bad).toBeDefined();
        expect(bad).toMatchInlineSnapshot(
            `Specifically serious error!`
        );

        done();
    });

рдпрджрд┐ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рдлреЗрдВрдХрддрд╛ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рд╡рд░реНрдЧ рдФрд░ рдЙрд╕ рдзрд╛рдЧреЗ рд╕реЗ рд╕рд▓рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ (рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛)ред
toThrow() рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдореВрд▓реНрдп рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ - рддреЛ рдлреЗрдВрдХ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдпрд╣ рдбреЙрдХреНрд╕ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред
рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рднрд▓реЗ рд╣реА рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлреЗрдВрдХрддрд╛ рд╣реИ:

async function f() {throw 'aa'}
const res = await expect(f()).rejects.toThrow()`

рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ):

async function f() {throw 'aa'}
const res = await expect(f()).rejects.toBeTruthy()`

рдПрдХ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ toBeDefined() рдХреЗ рдмрдЬрд╛рдп toBeTruthy() :
async function f() {throw 'aa'} const res = await expect(f()).rejects.toBeTruthy()`

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

hramos picture hramos  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

emmby picture emmby  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Secretmapper picture Secretmapper  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

GrigoryPtashko picture GrigoryPtashko  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jardakotesovec picture jardakotesovec  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ