Jest: рдЙрдореНрдореАрджреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╡-рдкрдардиреАрдп рд╕рдВрджрд░реНрдн

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

рдпрджрд┐ рдПрдХ рдПрдХрд▓ it рдореЗрдВ рдХрдИ рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ, рддреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЗрди рдирдВрдмрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рдХреНрд░реЙрд╕-рд░реЗрдлрд░ рдХрд┐рдП рдмрд┐рдирд╛ рдХреМрди рд╕реА рдЕрдкреЗрдХреНрд╖рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣реАред

test('api works', () => {
    expect(api()).toEqual([]) // api without magic provides no items
    expect(api(0)).toEqual([]) // api with zero magic also provides no items
    expect(api(true)).toEqual([1,2,3]) // api with magic enabled provides all items
})

рдХреМрди рд╕реА рдЙрдореНрдореАрдж рд╡рд┐рдлрд▓ рд░рд╣реА? рдкрд╣рд▓рд╛ рдпрд╛ рджреВрд╕рд░рд╛?

image

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреБрдЫ рдорд╛рдирд╡ рдкрдардиреАрдп рд╕рдВрджрд░реНрдн рд╣реЛрдВ рдЬреЛ рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрдВ рдХрд┐ рдХреМрди рд╕реА рдЕрдкреЗрдХреНрд╖рд╛ рд╡рд┐рдлрд▓ рд░рд╣реА рдФрд░ рдорд╛рдирд╡ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдмрд┐рдирд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЗрди рдирдВрдмрд░ рдЦреЛрдЬрдиреЗ рдФрд░ рдЙрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдореИрдкрд┐рдВрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдХреЛрдбред


рдиреАрдЪреЗ рджрд┐рдП рдЧрдП tape рдХреЗ рдмрд░рд╛рдмрд░ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓реЗ рджрд╛рд╡реЗ рдХреА рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд╛рдж рдЯреЗрдк рдЬрдорд╛рдирдд рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред tape рдкреНрд░рддреНрдпреЗрдХ рдЕрдкреЗрдХреНрд╖рд╛ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдКрдкрд░ рдПрдХ рдорд╛рдирд╡-рдкрдардиреАрдп рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдП рдмрд┐рдирд╛ рдХреМрди рд╕рд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд░рд╣рд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдорд╛рдирд╡-рдкрдардиреАрдп рд╢реЛрд░ рдХреЛ рдкрд░реАрдХреНрд╖рдг рд╕реНрд░реЛрдд рдореЗрдВ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рддрдХ рдзрдХреЗрд▓рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдк рд╡реИрд╕реЗ рднреА рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

test('api works', t => {
  t.deepEquals(api(), [], 'api without magic provides no items')
  t.deepEquals(api(0), [], 'api with zero magic also provides no items')
  t.deepEquals(api(true), [1,2,3], 'api with magic enabled provides all items')
})

image


рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирд╡-рдкрдардиреАрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЛ jest рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд it рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рдкреЗрдЯрдирд╛ рд╣реИ рдЬреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╡рд░реНрдмреЛрдЬрд╝ рдЖрдИрдПрдордУ рд╣реИред

describe('api works', () => {
  test('api without magic provides no items', () => {
    expect(api()).toEqual([])
  })
  test('api with zero magic also provides no items', () => {
    expect(api(0)).toEqual([])
  })
  test('api with magic enabled provides all items', () => {
    expect(api(true)).toEqual([1,2,3])
  })
})

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдХреЛрдИ рднреА рдХрд┐рд╕реА рднреА рддрд░рд╣ expect рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рдорд╛рдирд╡-рдкрдардиреАрдп рд╕рдВрджрд░реНрдн рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЬреИрд╕реЗ

рдЕрднрд┐рдХрдерди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрдн рд╕рдВрджреЗрд╢:

test('api works', () => {
    expect(api()).toEqual([], 'api without magic provides no items')
    expect(api(0)).toEqual([], 'api with zero magic provides no items')
    expect(api(true)).toEqual([1,2,3], 'api with magic enabled provides all items')
})


рдпрд╛ рд╕рдВрджрд░реНрдн рд╕рдВрджреЗрд╢ рдПрдХ рдЬрдВрдЬреАрд░ рдХреЗ рд░реВрдк рдореЗрдВ .because рдпрд╛ .why рдпрд╛ .comment рдпрд╛ .t рдпрд╛ рдХреБрдЫ рдФрд░:

test('api works', () => {
    expect(api()).toEqual([]).because('api without magic provides no items')
    expect(api(0)).toEqual([]).because('api with zero magic provides no items')
    expect(api(true)).toEqual([1,2,3]).because('api with magic enabled provides all items')
})

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рд╢рд╛рдпрдж рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЬреЗрд╕реНрдЯ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрд░реЛрдд рдХреЛрдб рд▓рд╛рдЗрди рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реНрд╡рдпрдВ рдЪрд╛рд▓реВ рд╣реИред

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

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдФрд░ рдЗрд╕ рднрдВрдбрд╛рд░ рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рдФрд░ рдЕрд░реНрдердкреВрд░реНрдг рд╣реЛрдЧрд╛:

it('has all the methods', () => {
  since('cookie is a method').expect(reply.cookie).toBeDefined();
  since('download is a method').expect(reply.download).toBeDefined();
  since('end is a method').expect(reply.end).toBeDefined();
  // ...
});

рдЙрдкрдпреЛрдЧ because рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдЕрд░реНрдердкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ since рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдкреАрдЖрд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред

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

рдЕрд░реЗ! рддреЛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдЬреИрд╕реНрдореАрди рдореЗрдВ рд░рдЦрддреЗ рдереЗ рд▓реЗрдХрд┐рди рдкрд╛рдпрд╛ рдХрд┐ рдПрдлрдмреА рдкрд░ рд╣рдЬрд╛рд░реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдлрд╛рдЗрд▓реЗрдВ, рдХрд┐рд╕реА рдиреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рддреЛ рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдиреБрдорд╛рдирд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдПрдХ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫрд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЙрдореНрдореАрдж рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ (рдмрд┐рд▓реНрдХреБрд▓ рдЖрдкрдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреА рддрд░рд╣)ред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╣рдо рдЙрд╕ рд▓рд╛рдЗрди рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рджрд╛рд╡рд╛ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд▓рдВрдмрд╛ рд╣реЛрддрд╛ рд╣реИ:

expect(a).toEqual({
  тАж
});

рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рдЬреЗрдПрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдФрд░ рд▓рдВрдмреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдзреНрд╡рд╕реНрдд рдХрд░рдирд╛) рдпрд╛ рдЗрд╕реЗ рд╕реБрдВрджрд░ рдмрдирд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рдХреБрдЫред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрднреА рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦрд╛ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдЬреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдореБрджреНрджреЛрдВ рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдЬреИрд╕реНрдореАрди рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рдереЗ рд▓реЗрдХрд┐рди рдкрд╛рдпрд╛ рдХрд┐ рдПрдлрдмреА рдкрд░ рд╣рдЬрд╛рд░реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдлрд╛рдЗрд▓реЗрдВ, рдХрд┐рд╕реА рдиреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛

@cpojer рддреЛ рдкреИрдЯрд░реНрди рдкреНрд░рддреНрдпреЗрдХ рджрд╛рд╡реЗ рдХреЛ it рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реИ? рдФрд░/рдпрд╛ рдХреЗрд╡рд▓ рд▓рд╛рдЗрди рдирдВрдмрд░реЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдВ?

рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдХрдо рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╣реИ? рдпрд╛ рд╢рд╛рдпрдж рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╕реБрд╡рд┐рдзрд╛ рдореМрдЬреВрдж рд╣реИ? рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЬреИрд╕реНрдореАрди рдореЗрдВ рдерд╛ред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╣рдо рдЙрд╕ рд▓рд╛рдЗрди рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдЕрднрд┐рдХрдерди рдХрдИ рд▓рд╛рдЗрдиреЗрдВ рд▓рдВрдмреА рд╣реЛрддреА рд╣реИ

рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рд╕реЗ рдЕрднрд┐рдХрдерди рдореЗрдВ рдЕрдзрд┐рдХ рдЕрд░реНрде рд╕рдВрдмрдВрдзреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╢рд╛рдпрдж?

const adminUser = {
  тАж
}
expect(a).toEqual(adminUser);

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрднреА рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦрд╛ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИ

рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдЖрдк рд╣рд░ рдЪреАрдЬ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╡рд░реНрдмреЛрдЬрд╝ (IMO) рд░реИрдкрд░ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ, рддрдм рддрдХ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рджрд╛рд╡рд╛ рд╡рд┐рдлрд▓ рд░рд╣рд╛ред рдпрд╣ рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЛрд░реНрд╕рдореИрдк рд▓рд╛рдЗрди рдирдВрдмрд░ рд╣рдореЗрд╢рд╛ рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░реАрдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд▓реНрджреА рдФрд░ рд╕рдЯреАрдХ рд╕рдордЭ рдЯреВрдЯ рдЧрдИ рдФрд░ рдХрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдЬреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдореБрджреНрджреЛрдВ рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рдореИрдВрдиреЗ рдКрдкрд░ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджрд┐рдП рд╣реИрдВ:

рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдЖрд╕рд╛рди рдпрд╛ рдЕрд▓рдЧ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ?

рдЕрд░реЗ @timoxley! рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдРрд╕рд╛ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛ред

рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд┐рд▓рд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд╕реЗ рдЪреАрдЬреЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рддрд░реНрдХ рдПрдХ рдирд┐рдХрдЯрддрд╛ рд╣реИ рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢

expect(555).toBeCloseTo(111, 2, 'reason why');
expect(555).toBeCloseTo(111, 'reason why');

рджреВрд╕рд░рд╛ рд╕реБрдЭрд╛рд╡ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕реЗ рд╣реА рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдореИрдЪрд░ рдлреЗрдВрдХ рджреЗрдЧрд╛

expect(1).toBe(2)/* will throw here */.because('reason');

рдореИрдЪрд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдХрд╛рд░рдг рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:

expect(1).because('reason').toBe(2);
// or 
because('reason').expect(1).toBe(2);

рд▓реЗрдХрд┐рди рдпрд╣ рдПрдкреАрдЖрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк expect . рдореЗрдВ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛

expect(1, 'just because').toBe(2);

рд▓реЗрдХрд┐рди рдпрд╣ рдкрд┐рдЫрд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдЬреАрдирд┐рдпрд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрдард┐рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдХреЗрд╡рд▓ рдмрджрддрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред

рдЕрддреАрдд рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╕реНрдЯрдо рдорд┐рд▓рд╛рдирдХрд░реНрддрд╛ рдмрдирд╛рдирд╛ рдерд╛ред рд╣рдо рдЬреЗрд╕реНрдЯ рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ expect.extend рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрд╣ рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдореИрдЪрд░реНрд╕ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреИрд╕реЗ:

expect(a).toEqualMySpecificThing(тАж)

рдЬреЛ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╡рд┐рдлрд▓рддрд╛ рд╕рдВрджреЗрд╢ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░рд┐рд▓реЗ рдЬреИрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдореИрдЪрд░реНрд╕ рджреЗрдЦреЗрдВ: https://github.com/facebook/relay/blob/master/src/tools/__mocks__/RelayTestUtils.js#L281

рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХреЗ рдХрд╛рд░рдг рдмрдВрдж рд╣реЛ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рддреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

@cpojer @dmitriiabramov рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред

expect рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рддрд░реНрдХ рдпрд╛ .because рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░рдг рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд╣реЛрдиреЗ рдпрд╛ рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдЗрдВрдЬреАрдирд┐рдпрд░ рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ

@cpojer рд╕рд╣рдордд! рдбрд┐рдмрдЧрд┐рдВрдЧ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рди рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд╡рд┐рдлрд▓рддрд╛ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдХрдо рд╡рд░реНрдмреЛрдЬрд╝ рдПрдкреАрдЖрдИ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдХреБрдЫ рдареЛрд╕ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╕рдордХрдХреНрд╖ рджрд╛рд╡реЗ + рдЯреЗрдк рдХреЗ рд╕рд╛рде рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЗрд╕реНрдЯ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рд▓рдЧрднрдЧ рджреЛрдЧреБрдирд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

  • 1.8x рд▓рд╛рдЗрдиреЗрдВ (6 рдмрдирд╛рдо 11)
  • 2x рдЗрдВрдбреЗрдВрдЯреЗрд╢рди (1 рдмрдирд╛рдо 2)
  • 2x рдорд╛рддрд╛-рдкрд┐рддрд╛/рдХрд░реНрд▓реА (24 рдмрдирд╛рдо 48) !

рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!

// tape
test('api works', t => {
  t.deepEquals(api(), [], 'api without magic provides no items')
  t.deepEquals(api(0), [], 'api with zero magic also provides no items')
  t.deepEquals(api(true), [1,2,3], 'api with magic enabled provides all items')
  t.end()
})

// jest
describe('api works', () => {
  test('api without magic provides no items', () => {
    expect(api()).toEqual([])
  })
  test('api with zero magic also provides no items', () => {
    expect(api(0)).toEqual([])
  })
  test('api with magic enabled provides all items', () => {
    expect(api(true)).toEqual([1,2,3])
  })
})

рдЕрджреНрдпрддрди : рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рддреАрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░ рдордЬрд╝рд╛рдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

// jest
describe('api works', () => {
  test('api without magic provides no items', () => expect(api()).toEqual([]))
  test('api with zero magic also provides no items', () => expect(api(0)).toEqual([]))
  test('api with magic enabled provides all items', () => expect(api(true)).toEqual([1,2,3]))
})

рдпрд╣ рдХреБрдЫ рд▓рдВрдмреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрди рдЖрдБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рд╣рдордиреЗ рдкрд╣рд▓реЗ рддреБрд▓рдирд╛ рдХреА рдереА:

  • 0.8x рд▓рд╛рдЗрдиреЗрдВ (6 рдмрдирд╛рдо 5)
  • 1x рдЗрдВрдбреЗрдВрдЯреЗрд╢рди (1 рдмрдирд╛рдо 1)
  • 1.75x рдорд╛рддрд╛-рдкрд┐рддрд╛/рдХрд░реНрд▓реА (24 рдмрдирд╛рдо 42)

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд▓рд╛рдЗрдирдмреНрд░реЗрдХ рдХреЗ рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рд╡рд░рдг рд╣реЛрдиреЗ рд╕реЗ, рддрд░реНрдХ рдХреЛ рджреГрд╖реНрдЯрд┐ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ "рдорд╛рдВрд╕" рдХреЛ рд░рдЦрддрд╛ рд╣реИ, рдпрд╛рдиреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджрд╛рд╡рд╛, рдХреБрдЫ рдордирдорд╛рдиреА рдХреЙрд▓рдо рд╕реНрдерд┐рддрд┐ рдкрд░ред

рдкрд░реАрдХреНрд╖рдг рд╡рд┐рд╡рд░рдг рдХреЛ рдкрдврд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдорд╣рд┐рдорд╛рдордВрдбрд┐рдд рдЯрд┐рдкреНрдкрдгреА рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдкрдВрдХреНрддрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рджреБрдЦрдж рдкрд╛рдЧрд▓рдкрди рд╣реЛрдЧрд╛:

/* api without magic provides no items */ expect(api()).toEqual([])
/* api with zero magic also provides no items */ expect(api(0)).toEqual([])
/* api with magic enabled provides all items */ expect(api(true)).toEqual([1,2,3])

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╕рднреА рдЕрднрд┐рдХрдерди рдХреЛрдб рдПрдХ рд╣реА рдХреЙрд▓рдо рдореЗрдВ рдмрдбрд╝реЗ рдХрд░реАрдиреЗ рд╕реЗ рдкрдВрдХреНрддрд┐рдмрджреНрдз рд╣реЛрдВрдЧреЗ рддрд╛рдХрд┐ рдЗрд╕реЗ рдорд╛рдирд╡ рджреНрд╡рд╛рд░рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрд╕ рд╕реЛрдЪ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ $#$4 expect #$ рдХреЗ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реБрдЭрд╛рд╡ рдХреЗ рдмрдЬрд╛рдп рдкреАрдЫреЗ рд╡рд╛рд▓реЗ .because рдлреЙрд░реНрдо рдХрд╛ рджреГрдврд╝рддрд╛ рд╕реЗ рдЪрдпрди рдХрд░реВрдВрдЧрд╛ред

рдмрд╛рддрдЪреАрдд рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдзреНрдпрд╛рди рджреЗрдВ, рдХрд┐ рдЖрдкрдХреЛ рд╡рд┐рд╡рд░рдг рдмреНрд▓реЙрдХ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЪреАрдЬреЗрдВ рдЫреЛрдЯреА рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред .because рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдореИрдЪрд░ рдлреЗрдВрдХрддрд╛ рд╣реИ (рдЬреЛ .because рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрддрд╛ рд╣реИ), рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд╛рдо рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдкреНрд░рддреНрдпреЗрдХ рдореИрдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ?

рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рд╣рдо рдЗрд╕реЗ expect рдХреЗ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВред
рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣рдо рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореИрдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
рдЬреИрд╕реЗ

expect(obj).toHaveProperty('a.b.c', 'is that a reason or a value of the property?');

рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХреЗ рдХрд╛рд░рдг рдмрдВрдж рд╣реЛ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рддреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

@cpojer рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ expect(value).toBe(something, 'because message') рдХреЗ рдЪрдореЗрд▓реА (рдФрд░ рдЕрдиреНрдп) рддрд░реАрдХреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

рдПрдХ рдЙрджрд╛рд╣рд░рдг redux-saga/redux-рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдХрд┐рд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реБрдЖ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╡рд░рдг рднреА рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ ..

@jayphelps рд╣рдо рдЕрдм рдЪрдореЗрд▓реА рдХреЗ рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рднреА рдЪрдореЗрд▓реА рдореИрдЪрд░реНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ

@dmitriiabramov рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореЗрд░рд╛ рдкреНрд░рд╢реНрди рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред рдХреНрдпрд╛ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдЪрдореЗрд▓реА _рд╡реЗ_ рдХреЛ рд╡рд╛рдкрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рд╡реЗ рд╡рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

@jayphelps рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдХрд╛рд░рдг рд╕рднреА рдореИрдЪрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

expect(obj).toHaveProperty('a.b.c', 'is that a reason or a value of the property?');

рдФрд░ рд╕рд┐рдВрдЧ рдЬреЗрд╕реНрдЯ рдореИрдЪрд░реНрд╕ рдХреЛ рдерд░реНрдб рдкрд╛рд░реНрдЯреА рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рддрд░реНрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ

рд╕рдмрд╕реЗ рд╕рд╛рдл рд╡рд┐рдХрд▓реНрдк рд╢рд╛рдпрдж рдЗрд╕реЗ expect рдХреЗ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИред

expect(123, 'jest because').toEqual(123);

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдПрдкреАрдЖрдИ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдлреЗрд╕рдмреБрдХ рдЯреЗрд╕реНрдЯ рд╕реВрдЯ рдореЗрдВ рд▓рдЧрднрдЧ рдХрднреА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:

beforeEach(someSharedSetup);
test('reason or description', () => expect(1).toBe(1));

рдпрд╣ рдмрд╕ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рд╣реИ :)

рдпрд╛ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп describe() рдХреЙрд▓ рдореЗрдВ рднреА рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

@dmitriiabramov рдХрд╖реНрдЯрдкреНрд░рдж рдорд╛рдорд▓реЗ рддрдм рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рд░рд╛рдЬреНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕рд╛рдЧ, рдорд╣рд╛рдХрд╛рд╡реНрдп, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдореЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рд▓рд╛рдн рдХреЗ рдПрдХ рдЯрди рджреЛрд╣рд░рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ AFAIKред

it('stuff', () => {
  const generator = incrementAsync();

  expect(generator.next().value).toBe(
    call(delay, 1000)
  );

  expect(generator.next().value).toBe(
    put({ type: 'INCREMENT' })
  );

  expect(generator.next()).toBe(
    { done: true, value: undefined }
  );
});

рдпрд╛ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╡рд░рдг() рдХреЙрд▓ рдореЗрдВ рднреА рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рд╡рд┐рд╕реНрддреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдиреЗрд╕реНрдЯрд┐рдВрдЧ рд╡рд░реНрдгрди рдХреЙрд▓ AFAIK рд╕рд┐рд░реНрдл рдЕрдиреБрднрд╛рдЧ рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛, рдкрд░реАрдХреНрд╖рдг рдЕрднреА рднреА рдПрдХ рд╕рд╛рде рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рд╣реИ рдирд╛?

рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ (рдлрд╝рд╛рдЗрд▓реЗрдВ) рдПрдХ рд╕рд╛рде рдЪрд▓рддреЗ рд╣реИрдВ, test() рдХреЙрд▓ рдирд╣реАрдВ рдЪрд▓рддреЗ рд╣реИрдВред

рдореИрдВ рд╕реЛрдЪрдиреЗ рд▓рдЧрд╛ рд╣реВрдБ рдХрд┐ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ

test('111' () => {
  jest.debug('write something only if it fails');
  expect(1).toBe(2);
});

рдПрдХ рдмрд╛рдд рд╣реЛ рд╕рдХрддреА рд╣реИ

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдФрд░ рдЗрд╕ рднрдВрдбрд╛рд░ рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рдФрд░ рдЕрд░реНрдердкреВрд░реНрдг рд╣реЛрдЧрд╛:

it('has all the methods', () => {
  since('cookie is a method').expect(reply.cookie).toBeDefined();
  since('download is a method').expect(reply.download).toBeDefined();
  since('end is a method').expect(reply.end).toBeDefined();
  // ...
});

рдЙрдкрдпреЛрдЧ because рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдЕрд░реНрдердкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ since рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдкреАрдЖрд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред

рдХреГрдкрдпрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдореИрдВ рдЗрд╕реЗ рдмрд╣реБрдд рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬрд╛рдирдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЦреБрджрд╛рдИ рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдпрд╣ рди рдХрд╣реЗрдВ "рд╕рд░рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ"ред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЛ _writing_ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рд╕реЗ рдЕрдзрд┐рдХ рдирдлрд░рдд рд╣реИ, рд╡рд╣ рд╣реИ _rewriting_ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯред

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

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

const since = (text) => {
  return new Proxy(global, {
    get: (orig, key) => {
      return (...args) => {
        try {
          const stack = orig[key](...args);
          return new Proxy(stack, {
            get: (orig, key) => {
              return (...args) => {
                try {
                  const ret = orig[key](...args);

                  // ... implement recursion here

                } catch (err) {
                  console.log('2', key, text, err);
                  throw err;
                }
              }
            }
          });
        } catch (err) {
          console.log('1', key, text, err);
          throw err;
        }
      };
    }
  });
};

рддреАрди рдпрдерд╛рд░реНрдерд╡рд╛рджреА рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

  • рдпрд╣ рддрд░реАрдХрд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдореБрдЦреНрдп рдЬреЗрд╕реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдкреАрдЖрд░ рдмрдирд╛рддрд╛ рд╣реВрдВред
  • рдЬреЗрд╕реНрдЯ рдореЗрдВ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░реЗрдВ рдФрд░ рдХреЛрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВред рдмрд╣реБрдд рдХрд╛рдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдХреБрдЫ рд╕рджрд╕реНрдп рдЗрд╕ рдореБрджреНрджреЗ/рджрд┐рд╢рд╛ рдкрд░ рдЕрд░реНрдз-рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рддреЗред
  • рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВред рдЕрд╡рд╛рдВрдЫрдиреАрдп рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдЦреЛрдЬрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕реЗ рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджреЗрдЦреЗрдВ:

describe('Test', () => {
  it('works', () => {
    since('It fails!').expect('a').toEqual('b');
  });
});

рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЧреИрд░-рддреБрдЪреНрдЫ рдкрд░реАрдХреНрд╖рдг рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдордЭрджрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╣рдореЗрд╢рд╛ рдЗрддрдиреЗ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рдХрд╕реНрдЯрдо рдореИрдЪрд░реНрд╕ рдпрд╛рдж рд░рдЦреЗрдВ - рд╡реЗ рдЧрдгрд┐рдд рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдкреЗрдХреНрд╖рд╛ рд╕рдВрджрд░реНрдн рдЖрдкрдХреЛ рдпрд╣ рд╕рдВрджрд░реНрдн рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рдВрджрд░реНрдн рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдм рддрдХ рджреЗрдЦрд╛ рд╣реИред

рдЬрдм рдореИрдВрдиреЗ рдХреБрдЫ рддреЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛, рддреЛ рдЬреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдбреАрдмрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рд▓реЙрдЧрд┐рдВрдЧ рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА _modifications рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЬреЛ рдХрд┐ рдЯреЗрд╕реНрдЯ рд░рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдмрд╣реБрдд рдХрдо рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬреИрд╕реНрдореАрди рдореЗрдВ, рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордЭ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рдВрджрд░реНрдн рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред
рдЬрд╛рд╡рд╛ рдХреЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ JUnit рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднреА рдареАрдХ рд╡реИрд╕реА рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдореБрдЭрд╕реЗ рдЧрд▓рддреА рд╣реБрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣рд╛рдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ _technological_ рдкреНрд░рддрд┐рд╡рд╛рдж рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдФрд░ "рдЗрд╕реЗ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛" рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╕рд┐рд░реНрдл рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╣реИрдВред

рдХреНрдпрд╛ рд╣рдо рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ jest.debug() рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ @aaronabramov рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореЗрд░реЗ рд▓рд┐рдП рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред

This:

it('has all the methods', () => {
    since('cookie is a method', () => expect(reply.cookie).toBeDefined());
});

can be supported by adding this:


// setupTestFrameworkScriptFile.js
// http://facebook.github.io/jest/docs/configuration.html#setuptestframeworkscriptfile-string
global.since = (explanation, fn) => {
    try {
        fn();
    } catch(e) {
        e.message = explanation + '\n' + e.message;
        throw e;
    }
};

рд╕рд╛рде рд╣реА, рдЬреИрд╕реНрдореАрди-рдХрд╕реНрдЯрдо-рд╕рдВрджреЗрд╢ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ:

describe('test', function() {
  it('should be ok', function() {
    since(function() {
      return {'tiger': 'kitty'};
    }).
    expect(3).toEqual(4); // => '{"tiger":"kitty"}'
  });
});

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

рд╣рдореНрдо.. рдпрд╣ рднреА рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╕реВрдЪреА рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдЗрд╕ рдереНрд░реЗрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдлреЗрд╕рдмреБрдХ рдкрд░ рдЬреЗрд╕реНрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЖрдкрдХреЗ рдЕрдкрдиреЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рд╣реИрдВ рдЬреЛ рдореМрдЬреВрджрд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ рдЬреЛ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рд╣реИ (рд╕реНрд╡рдпрдВ рд╢рд╛рдорд┐рд▓)ред

рдкреАрдЖрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рддрд░реНрдХ () рдпрд╛ рдмрд╛рдж рд╕реЗ () рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рдЧреЗрдЧрд╛? рдореИрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рджреЗрдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реВрдВред

рдореИрдВрдиреЗ рдЕрднреА рд╕реВрддреНрд░ рдХреЛ рдкрдврд╝рд╛ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреЗ рддрд░реНрдХ рджреЗрдЦреЗ рд╣реИрдВред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдПрдХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ @timoxley рдореВрд▓ рд░реВрдк рд╕реЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрднреА рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

import assert from 'assert'
import chalk from 'chalk'

test('api works', () => {
  assert.deepEqual(
    api(),
    [],
    chalk.red('api without magic provides no items')
  )
  assert.deepEqual(
    api(0),
    [],
    chalk.red('api with zero magic also provides no items')
  )
  assert.deepEqual(
    api(true),
    [1, 2, 3],
    chalk.red('api with magic enabled provides all items')
  )
})

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд▓рд╛рд▓ рд░рдВрдЧ (рдЕрдиреНрдпрдерд╛ рдмрд┐рдирд╛ рд░рдВрдЧ рдХреЗ рдкреНрд░рд┐рдВрдЯ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдЗрд╕реЗ expect рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ since рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдЧрд░ рджреВрд╕рд░реЗ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡рд╣рд╛рдВ рдХреБрдЫ рдФрд░ рдлреЗрдВрдХ рджреЗрдВ:

const expectWithMessage = expect.withMessage(
  'api with magic enabled provides all items'
)
expectWithMessage(api(true)).toEqual([1, 2, 3])

// could be rewritten like
expect
  .withMessage('api with magic enabled provides all items')(api(true))
  .toEqual([1, 2, 3])

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ since рд╕реЗ рдмреЗрд╣рддрд░ рдкрд╕рдВрдж рд╣реИред рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рд╣реВрдБ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ :)

рдУрд╣, рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдЬреАрдирд┐рдпрд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрдард┐рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдХреЗрд╡рд▓ рдмрджрддрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдХрдард┐рди рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдпреЛрдЧрд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдЬреЛ рд▓реЛрдЧ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП "рд╕рдордп рдмрд░реНрдмрд╛рдж" рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рдХреЗрд╡рд▓ рд╕рд╣рд╛рдпрдХ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╡реЗ рдПрдХ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдЖ рдЬрд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧреА рд╕рдВрджреЗрд╢ рд╣реЛрдВрдЧреЗ рдФрд░ рдлрд┐рд░ рд╡реЗ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдВрдЧреЗ рдЗрдВрдЬреАрдирд┐рдпрд░ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рджрд╛рд╡реЗ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рд▓рд┐рдпрд╛: рдкрд▓рдХ:

рд╣рд╛рдп @cpojer рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ?

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬреЗрд╕реНрдЯ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ ... рдлрд┐рд▓рд╣рд╛рд▓ рдореИрдВ рдПрдХ рд▓реВрдк рдХреЗ рднреАрддрд░ рдПрдХ рдЕрд╕рдлрд▓ рджрд╛рд╡реЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреИрд╕реЗ
expectationsArray.forEach(expectation => expect(...))

рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рдмрд┐рдирд╛ рдХреМрди рд╕реА рдЙрдореНрдореАрджреЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ (рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЧрд▓рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ..?)

рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж

@ рдПрдордЬреЗ-рдПрдпрд░рд╡реЙрд▓реЗрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓реВрдк рдореЗрдВ test рдХреЗ рд╕рд╛рде рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЕрдЪреНрдЫреЗ рд╣реИрдВ:

const expectationsArray = [[0, 'a'], [1, 'b']];

expectationsArray.forEach(([expectation, desc]) => {
  test(`test ${desc}`, () => {
    expect(expectation).toBeGreaterThanOrEqual(2);
  });
});

рдЙрдореНрдореАрджреЛрдВ рдХреЗ рджреМрд░рд╛рди рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдореБрдЭреЗ рдордЬрд╛рдХ рдХреЗ рд╕рд╛рде рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред test рдХреЗ рддрд╣рдд рдЙрдореНрдореАрджреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЬреЗрд╕реНрдЯ describe (#2235 ) рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ test рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХрд╛рдзрд┐рдХ test рдиреЗрд╕реНрдЯреЗрдб рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

async function getArray() {
  return [0,0,0,0,0,0]
}

describe('Custom messages with async', async () => {
  const array = await getArray();
  array.forEach((item) => {
    test(`test${item}`, () => {
      expect(item).toBe(0)
    });
  });
})

рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ?

рдУрдкреА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП ("рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреБрдЫ рдорд╛рдирд╡ рдкрдардиреАрдп рд╕рдВрджрд░реНрдн рд╣реЛрдВ рдЬреЛ рдЗрд╕реЗ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрдВ рдХрд┐ рдХреМрди рд╕реА рдЕрдкреЗрдХреНрд╖рд╛ рд╡рд┐рдлрд▓ рд░рд╣реА"), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЬреЗрд╕реНрдЯ 22 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдо рдЕрд╕рдлрд▓ рдЕрднрд┐рдХрдерди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджреЗрд╢ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдпрджрд┐ рдпрд╣ _is_ рд╣реИ, рддреЛ рдпрд╣ рдКрдкрд░ рдпрд╛ рдЕрднрд┐рдХрдерди рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рдХреЛрдб рдЯрд┐рдкреНрдкрдгреА рд╣реЛ рд╕рдХрддреА рд╣реИ

image

Async рд╡рд░реНрдгрди рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ (рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдбрдлрд╝реНрд░реЗрдо рджреНрд╡рд╛рд░рд╛ рдорджрдж рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ async рд╡рд░реНрдгрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп beforeEach рдпрд╛ beforeAll рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдБрдЧрд╛

@kentcdodds рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ beforeEach рдпрд╛ beforeAll рд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ? рдпрджрд┐ рдЖрдк beforeEach рдФрд░ beforeAll рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ async рдХреЙрд▓ рдкрд░рд┐рдгрд╛рдо рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рдиреЗрд╕реНрдЯреЗрдб test рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред

рдЖрд╣, рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рдЖрдк рдЙрд╕ рдПрд╕рд┐рдВрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рдереЗред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ ЁЯШЕ рд╣рд╛рдБ, рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП beforeEach рдпрд╛ beforeAll рдирд╣реАрдВ рдХрд░ рд╕рдХреЗред

@SimenB , рд╕рдВрджрд░реНрдн рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрд╛рдВрд╢ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рд▓реЗрдХрд┐рди рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реВрдк рдХреЗ рднреАрддрд░ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

@tojuhaka рдЗрд╕реЗ рдЖрдЬрдорд╛рдПрдВ: https://github.com/negativetwelve/jest-plugins/tree/master/packages/jest-plugin-context

рдУрдкреА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП ("рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреБрдЫ рдорд╛рдирд╡ рдкрдардиреАрдп рд╕рдВрджрд░реНрдн рд╣реЛрдВ рдЬреЛ рдЗрд╕реЗ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрдВ рдХрд┐ рдХреМрди рд╕реА рдЕрдкреЗрдХреНрд╖рд╛ рд╡рд┐рдлрд▓ рд░рд╣реА"), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рд╣рд╛рдВ, рдпрд╣ рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдореВрд▓ рд╕реНрд░реЛрдд рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬреЗрд╕реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рд╣реЛрдЧрд╛ред рдЖрдИрдПрдордУ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЖрдкреВрд░реНрддрд┐ рдХрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рднрд╛рд░реА рд╣рд╛рде рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред

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

рдЖрдк рдЙрд╕рдХреЗ рд▓рд┐рдП toHaveProperty рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

test('property', () => {
  expect({foo: 'bar'}).toHaveProperty('baz', 'foobar');
});

image

рдЕрдЧрд░ рдЖрдк рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд╣рд╛рдВ рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдЫреЛрдбрд╝ рджреЗрдВред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ _some_ рдорд╛рди рд╣реИ, рддреЛ рдЖрдк expect.anything() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
toMatchObject рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ assert рдХрд╛ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

test('property', () => {
  const obj = {foo: 'bar'};
  assert.equal(obj.baz, 'foobar', JSON.stringify(obj));
});

image

рдкрд╛рд░рд┐рддреЛрд╖рд┐рдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред assert.equal(obj.baz, 'foobar', JSON.stringify(obj)); рдореЗрд░реЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

@SimenB @mpseidel рдореБрдЦрд░ рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдХреЛрдИ рддреГрддреАрдп рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ? рдореБрдЭреЗ рдЬреЗрд╕реНрдЯ рдбреЙрдХреНрд╕ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред

@sharikovvladislav assert рдПрдХ рдиреЛрдб рдХреЛрд░ рдореЙрдбреНрдпреВрд▓ рд╣реИ https://nodejs.org/api/assert.html

@mpseidel рдЙрдлрд╝! рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ред рд╢реБрдХреНрд░рд┐рдпрд╛ред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИрдВред

рдореИрдВ рдврд╛рдВрдЪреЗ рдХреА рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЦрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╣рдЯрд╛ рджреЗрдВ)
export const explain = (expectation: () => void, explanation: string) => { try { expectation(); } catch(e) { console.log(explanation) throw e; } }

рдирдорд╕реНрддреЗ,
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрднреА рддрдХ рдХрд┐рд╕реА рдиреЗ рд▓реВрдк рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рд╕рдВрджреЗрд╢ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдЧрд╛ред
jest-plugin-context рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЗрд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рднрд╛рд░реА рд╣реИ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореБрджреНрджрд╛ рдЕрднреА рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЖрдИрдПрдордУ рд╣реИред
рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рджреЗрдЦреЗрдВ

describe('MyStuff', () => {
    it('should render and contain relevant inputs', () => {
      const wrapper = shallowWrapped(<MyStuff />);
      const expectedKeys = ['love','jest','but','need','details','for','expect'];
      expectedKeys.forEach((key) => {
        expect(wrapper.find({ id: key }).length).toEqual(1);
      });
    });
  });

рдЕрдкрдиреЗ рдЕрдкрд░рд╛рдзреА рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рд╕реМрднрд╛рдЧреНрдпред рдЕрднреА рдореБрдЭреЗ {len:.., key:..} рдХреА рддрд░рд╣ рдПрдХ рд▓рд╛рдЗрди рдЬреЛрдбрд╝рдиреА рд╣реЛрдЧреА рдпрд╛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╣ рд╕рд╛рдл рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо рдФрд░ рдЖрдЗрдЯрдо рдкреНрд░рддрд┐рдкрд╛рджрди рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдПред
рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ toEqual(1).context("my message") рдпрд╛ toEqual(1, "my message") рдЬрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдореЗрд╢рд╛ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЬреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдорд╣рд╛рди рдХрд╛рдо рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реВрдВ)ред

рд╢рд╛рдпрдж рдЙрд╕реА рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреИрд╕реЗ chai рдХрд░рддрд╛ рд╣реИ - рдпрд╛рдиреА рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЙрд▓ рдХреЗ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

expect(foo, 'this detail').toEqual(2)

рдЯреА

рдкрд╣рд▓реЗ рдЪрдореЗрд▓реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЖрдпрд╛ рдХрд┐ рдпрд╣ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐ afik рдпреЗ рд╕рднреА рдХрд╛рд░реНрдп рд╣реИрдВред рдХреНрдпрд╛ рд╣рдо рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ:

describe('MyStuff', () => {
    describe('should render and contain relevant inputs', () => {
      const wrapper = shallowWrapped(<MyStuff />);
      const expectedKeys = ['love','jest','but','need','details','for','expect'];

      expectedKeys.forEach((key) => {
        it(`contains key "${key}"`, () =>
          expect(wrapper.find({ id: key }).length).toEqual(1)
        )
      })
  });
});

2018-04-18-222246_646x390_scrot

@akkerman рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рдиред рдЪреВрдВрдХрд┐ рд╡рд░реНрдгрди рдФрд░ рдпрд╣ рдЬрд╛рджреВ рдХреЗ рдЧреНрд▓реЛрдмрд▓реНрд╕ рд╣реИрдВ рдЬреЛ рдЬреЗрд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдореБрдЭреЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рдерд╛ рдХрд┐ рд▓реВрдк рдореЗрдВ t` рд▓рд┐рдЦрдирд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдФрд░ рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

expect(foo).toEqual(bar).because('reason with %s placeholders')

рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рд╕рдорд╛рд░реЛрд╣

expect(foo).toEqual(bar).explainedBy((result) => `Lorem ipsum ${result}`)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рд╕рдВрд╢реЛрдзрдХ рдЬрд▓реНрджреА рд╕реЗ рдЕрдкрдардиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЯреА

2018-04-19 13:47 рдЬреАрдПрдордЯреА+02:00 тАв рдЬрд┐рдпреЛрд╡рд╛рдиреА рдбреА рд╕реВрдЬрд╛ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com :

рдПрдХ рдФрд░ рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдЙрдореНрдореАрдж (foo).toEqual(bar).рдХреНрдпреЛрдВрдХрд┐ ('% s рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рд░рдг')

рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рд╕рдорд╛рд░реЛрд╣

рдЙрдореНрдореАрдж (foo).toEqual(bar).explainedBy((result) => Lorem ipsum ${result} )

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/facebook/jest/issues/1965#issuecomment-382705387 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AAM5PwBCvET1KdEDeDEF7gGo708Naj8oks5tqHlSgaJpZM4Kc6Uu
.

--


рддрд╛рд░рдЬреЗрдИ рд╣реБрд╕реЗ
рдореЛрдмрд┐рд▓: 920 63 413

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ expect рдХрд╛рдо рдлреЗрдВрдХрдирд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╡реИрд╕реЗ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╛ рддреЛ expect(something, 'some helpful text on failure').toEqual(somethingElse) рдпрд╛ expect.context(something, 'some helpful text on).toEqual(somethingElse) рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ

рдХреНрдпрд╛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрд╕реНрдЯ рдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп рдХреИрд╕реЗ рдХрдИ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

  • рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдПрдХ рд╕реНрдЯреЗрдЯрдлреБрд▓ рд░рд┐рдПрдХреНрдЯ рдХрдВрдЯреЗрдирд░ рдХреИрд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛
  • рдХрдардкреБрддрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдХреИрд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛

рдЗрди рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж рд░рд╛рдЬреНрдп рдХреИрд╕реЗ рдмрджрд▓ рдЧрдпрд╛ (рдпрд╛ рдирд╣реАрдВ рдмрджрд▓рд╛), рдЗрд╕рд▓рд┐рдП рдмрд╣реБ-рдЕрднрд┐рдХрдерди рдкрд░реАрдХреНрд╖рдг рдХрднреА-рдХрднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ beforeEach рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдвреВрдВрдврддрд╛ рд░рд╣рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдореИрдВ @callumlocke рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдФрд░ рджрд╛рд╡реЗ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВред

рдЕрдЧрд░ рд╣рдо рдПрдХ рдРрд╕рд╛ рдПрдкреАрдЖрдИ рд▓реЗрдХрд░ рдЖрддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рд▓реЛрдЧ рдирдлрд░рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ? рдореБрдЭреЗ рд╕рдЪ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдореВрд▓реНрдпрд╡рд╛рди рдФрд░ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреАред

рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

expect(api()).toEqual([]) // api without magic provides no items
it('api without magic provides no items', () => expect(api()).toEqual([]))
test('api without magic provides no items', () => expect(api()).toEqual([]))
expect(api()).toHaveNoItems()

expect(api(), 'api without magic provides no items').toEqual([])
expect(api()).because('api without magic provides no items').toEqual([])
since('api without magic provides no items').expect(api()).toEqual([]))
because('api without magic provides no items').expect(api()).toEqual([]))
jest.debug('api without magic provides no items'); expect(api()).toEqual([]))

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд┐рдЫрд▓рд╛ .because() рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдореЗрдВ рд╕рднреА рдЪрд╛рд░ рд╡рд┐рдХрд▓реНрдк рдЖрдЬ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк (рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдПрдХ рдХреЛрдб рдлреНрд░реЗрдо) рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЙрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ рдПрдХ рдХрд╕реНрдЯрдо рдорд┐рд▓рд╛рдирдХрд░реНрддрд╛ (рд╡рд┐рдХрд▓реНрдк 4) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдЖрдВрджреЛрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рджреВрд╕рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЖрдХрд░реНрд╖рдХ рдХреНрдпрд╛ рд╣реИ? рджреВрд╕рд░рд╛ рд╕рдореВрд╣ рдХреНрдпрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдореИрдЪрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд░рдЦрд░рдЦрд╛рд╡ рдХреЛ рд╕рд╣реА рдард╣рд░рд╛ рд╕рдХрддрд╛ рд╣реИ (рдПрд╕рд┐рдВрдХ рдореИрдЪрд░реНрд╕, рдПрд╕рд┐рдореЗрдЯреНрд░рд┐рдХ рдореИрдЪрд░реНрд╕, рд╕реНрдкрд╛рдИ рдореИрдЪрд░реНрд╕, рдереНрд░реЛ рдореИрдЪрд░реНрд╕, рдкреНрд░реЙрдорд┐рд╕ рдореИрдЪрд░реНрд╕ рдФрд░ рдХрд╕реНрдЯрдо рдореИрдЪрд░реНрд╕ рдореЗрдВ)?

рдирдорд╕реНрддреЗ,
рдЖрдкрдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдорд┐рд▓реЗ рд╣реИрдВ:

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

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

рдЪреВрдВрдХрд┐ рдЙрди рдЧрддрд┐рд╢реАрд▓ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЕрднреА рднреА рджреБрд░реНрд▓рдн рд╣реИрдВ, рдЖрдИрдПрдордУ рд╣рдореЗрдВ рдЙрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ because/since рд╕рдорд╛рдзрд╛рди рдкрд╕рдВрдж рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреНрдпрд╛рджрд╛рддрд░ expect рдХреЛ try/catch рдореЗрдВ рд▓рдкреЗрдЯреЗрдЧрд╛ рдЬреЛ рд╕рдВрджреЗрд╢ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИ?
jest.debug рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ, рдореЗрд░реЗ рд▓рд┐рдП рдбрд┐рдмрдЧрд┐рдВрдЧ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рдПрдВ
"рдЕрдВрддрд┐рдо рддрд░реНрдХ" рд╡рд┐рдХрд▓реНрдк рднреА рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ expect рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдореИрдВ рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдБред рдореБрдЭреЗ рдмрд╕ рдлреАрдЪрд░ рдЪрд╛рд╣рд┐рдПред рдореИрдВ jest.debug рдПрдкреАрдЖрдИ рдкрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдРрд╕рд╛ рд╣реИ рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЪрд╛рд╣рд┐рдПред

@kentcdodds рдЪрд╛рд░ рдореМрдЬреВрджрд╛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

@ рдПрд░рд┐рдХ-рдмреНрдпреВрд░рд▓ рдХреНрдпрд╛ рдЖрдкрдиреЗ test.each рдФрд░ describe.each рдХреЛ рдЬреЗрд╕реНрдЯ 23 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ (рдЬреЗрд╕реНрдЯ <23 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз)?

рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВред рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕реБрд╡рд┐рдзрд╛ рдореМрдЬреВрдж рд░рд╣реЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рд╡рд░реАрдпрддрд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рд╣реЛрдЧрд╛:

  1. expect(api(), 'api without magic provides no items').toEqual([])
  2. because('api without magic provides no items').expect(api()).toEqual([]))
  3. since('api without magic provides no items').expect(api()).toEqual([]))
  4. expect(api()).because('api without magic provides no items').toEqual([])
  5. jest.debug('api without magic provides no items'); expect(api()).toEqual([]))

(test|describe).each рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдПрдХ рд╣реА рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдВ/рджрд╛рд╡рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрдЬ рдЪрд╛рд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рд╣реИ:

expect(api()).toEqual([]) // api without magic provides no items
it('api without magic provides no items', () => expect(api()).toEqual([]))
test('api without magic provides no items', () => expect(api()).toEqual([]))
expect(api()).toHaveNoItems()

рдЗрдирдореЗрдВ рдЧрд▓рдд рдХреНрдпрд╛ рд╣реИ? рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд _new_ рд╕рдорд╛рдзрд╛рди рдЗрди рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдорд╛рдореВрд▓реА рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рдХреБрдЫ рд╣реИ рдЙрд╕рд╕реЗ рд╡реЗ рдХреНрдпрд╛ рд▓рд╛рдн рд▓рд╛рддреЗ рд╣реИрдВ рдЬреЛ рд░рдЦрд░рдЦрд╛рд╡ рд▓рд╛рдЧрдд рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддреЗ рд╣реИрдВ?

@rickhanlonii рдЕрдЪреНрдЫрд╛ рдореБрдЭреЗ test.each рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдерд╛, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдорд╣рд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рддреАрд╕рд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╕рд░рдгреА рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкрд░реАрдХреНрд╖рдгред

рддреЛ рдЗрд╕рдиреЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреАрдмрджреНрдз рджреВрд╕рд░рд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛: рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╡рд┐рдлрд▓рддрд╛ рд╕рдВрджреЗрд╢, рдЬреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рддреЗрдЬрд╝ рдХрд░ рджреЗрдЧрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдирд╣реАрдВ рд╣реИрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝реАрд▓реНрдб рдорд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдВрдкреВрд░реНрдг рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдпрд╣ рд╡реИрдз рдЖрдИрдПрдордУ рд╣реИ, рдЬреЛ рдХреБрдЫ рднреА рд▓реЗрдЦрди рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдорд╛рдореВрд▓реА рдпрд╛ рдереЛрдбрд╝рд╛ рдмреЗрдорд╛рдиреА рд╣реЛред рдЖрдЦрд┐рд░рдХрд╛рд░ рд╣рдо рджреЛрдиреЛрдВ it рдФрд░ test рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдЕрдВрддрд░ рди рд╣реЛ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдЖрд░рд╛рдо рдХреЗ рд▓рд┐рдП рд╣реИред
рдпрд╣ рдорд╛рдореВрд▓реА рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд┐рдд (рдХреЛрдИ рджрдВрдб рдирд╣реАрдВ) рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: it рдпрд╛ test рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдирд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдирд╛рдо рдПрдХ рд╡реИрдз рд╕рдорд╛рдзрд╛рди рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдЬрдм рдореЗрд░рд╛ рдорддрд▓рдм рдПрдХ рджрд╛рд╡рд╛ рдмрдирд╛рдирд╛ рд╣реИ . рдореИрдВрдиреЗ рдХрднреА рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдерд╛ рдпрджрд┐ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

рдореЛрдЪрд╛ рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реИ ... рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд░реНрд╖реЛрдВ рдкрд╣рд▓реЗ рдЬреИрд╕реНрдореАрди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдерд╛ (рджреВрд╕рд░рд╛ рдмреЗрд╣рддрд░ рдЯрд╛рдЗрдорд░ рдордЬрд╛рдХ рдХрд░ рд░рд╣рд╛ рдерд╛ред) рдЕрдЧрд░ рдореБрдЭреЗ рд░рд┐рдПрдХреНрдЯ рдмреИрдВрдбрд╡рд╛рдЧрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдерд╛, рддреЛ рдореИрдВ рдЬреЗрд╕реНрдЯ рдпрд╛ рдХрд┐рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЕрдиреНрдп рдЬреИрд╕реНрдореАрди рд╡реНрдпреБрддреНрдкрдиреНрдиред

рддреНрд░реБрдЯрд┐ рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдХрдИ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдореЗрдВ рдПрдХ рд╕рдореНрдореЗрд▓рди рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЬреЗрд╕реНрдЯ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрдХрд░ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдерд╛ред рдореБрдЭреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдмрд╣реБрдд рд╕реЗ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓реЗ рд╣реИрдВ (рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж), рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдПрдХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рдирд╛ рдЬреЗрд╕реНрдЯ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЬреЛрдбрд╝рд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЙрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ рдЬреЛ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ (рдЧреИрд░-рдЬреЗрдПрд╕ рд╕рд╣рд┐рдд) рдХреЗ рд▓рд┐рдП рдЬреЗрд╕реНрдЯ рдкрд░ рд░реИрдВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

@mattphillips рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рд▓реИрдВрдб рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЬреЗрд╕реНрдЯ-рдЪреЗрди рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП expect . рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реНрдХ

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬреЗрдПрд╕ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдореЗрдВ рдпрд╣ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдорд╛рдирдХ рд╣реИред рдЬреЗрд╕реНрдЯ рдореЗрдВ рдЗрд╕реЗ рди рдкрд╛рдХрд░ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛ рд╣реБрдИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдПрдХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрддреЗ рд╣реИрдВред

@SimenB рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореИрдВрдиреЗ рдЖрдЬ рд╕реБрдмрд╣ рд╣реА рдЖрдкрдХрд╛ рд╕рдВрджреЗрд╢ рджреЗрдЦрд╛!

рд╣рд╛рдВ рдпрд╣ рдпреВрдЬрд░рд▓реИрдВрдб рдореЗрдВ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕реЗ рдЦрдЯрдЦрдЯрд╛рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ jest-expect-message https://github.com/mattphillips/jest-expect-message рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИ

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ: рдореБрд╕реНрдХрд╛рди:

рдмрдврд╝рд┐рдпрд╛, рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

@cpojer

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдЬреАрдирд┐рдпрд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрдард┐рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдХреЗрд╡рд▓ рдмрджрддрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред

рджреЛ рдЪреАрдЬрд╝реЗрдВ:

  1. рдЙрдореНрдореАрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдЬреЛрдбрд╝рдирд╛() рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╣реА рдХреБрдЫ рдХрдард┐рди рдмрдирд╛ рд░рд╣рд╛ рд╣реИред
  2. рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ред рдЕрдХреНрд╕рд░ рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╢рд░реНрдд рдкреВрд░реА рд╣реБрдИ рдереА, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЬреЗрд╕реНрдЯ рдореЗрдВ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореЛрдЪрд╛/рдЪрд╛рдИ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЯреЗрдк рдХрд╛ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдбреАрд▓ рдмреНрд░реЗрдХрд░ рд╣реИред рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рд╕рдорд░реНрдерди рдХреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛?

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

рдореБрдЭреЗ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдЦреЛрд▓рдирд╛ рдФрд░ рд▓рд╛рдЗрди рдирдВрдмрд░ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдУрдкреА рдореЗрдВ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдЬреЛ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╣реИ рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрджрд░ рдПрдХ рд▓реВрдк рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдирдо рдХреЗ рд╣рд░ рдореВрд▓реНрдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣:

it("Should contain at least one word of every wordType", () => {
  for (const wordType of wordTypes) {
    expect(words.find((word) => word.wordType === wordType)).toBeTruthy();
  }
});

рдЕрдЧрд░ рд╡рд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рд╡рд░реНрдб рдЯрд╛рдЗрдк рдорд╛рди рд╡рд┐рдлрд▓ рд╣реБрдЖред

рдореЗрд░рд╛ рдХрд╛рдо-рдЖрд╕рдкрд╛рд╕ рдЙрд╕ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо (рдпрд╛рдиреА рд╕рддреНрдп) рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрджрд┐ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЬреЗрд╕реНрдЯ рдЙрд╕ рд╕рдВрджреЗрд╢ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред

    expect(`${wordType} ${!!words.find((word) => word.wordType === wordType)}`).toEqual(`${wordType} ${true}`);

рдЬреЗрд╕реНрдЯ рдЗрд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ ...

expect(received).toEqual(expected)

Difference:

- Expected
+ Received

- 6 true
+ 6 false

... рдЬреЛ рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рд╡рд░реНрдб рдЯрд╛рдЗрдк 6 рдерд╛ред

рдпрд╛ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд░реВрдк рд╕реЗ рдХреБрдЫ рдРрд╕рд╛ ...

    if (!words.find((word) => word.wordType === wordType)) {
      expect(`Didn't find a word with wordType '${wordType}'`).toEqual(null);
    }

@cwellsx test.each рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдЗрд╕ рддрд░рд╣ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдкреНрд░рдХрд╛рд░ рдПрдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╢реАрд░реНрд╖рдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдкрд░реАрдХреНрд╖рдг рд╣реЛрдЧрд╛ (рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░)

рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛:

test("compare ArrayBufferCursors", () => {
    const orig: ArrayBufferCursor;
    const test: ArrayBufferCursor;

    expect(test.size).toBe(orig.size);

    while (orig.bytes_left) {
        expect(test.u8()).toBe(orig.u8());
    }
});

рдЕрднреА рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ ArrayBufferCursor рдореЗрдВ рдХреБрдЫ рдмрд╛рдЗрдЯ рдЧрд▓рдд рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рд╣реИред рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧреАред рд╢реБрдХреНрд░ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдпрд╣рд╛рдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдмрджрд╕реВрд░рдд рдФрд░ рдзреАрдореЗ рд╣реИрдВред

@rickhanlonii , рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдордЬрд╛рдХ рдХреА рд░рдЦрд░рдЦрд╛рд╡ рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рдХрд▓реНрдк рдЬреЛ рдЖрдк рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рджреЗрддреЗ рд╣реИрдВ, рдЕрдиреНрдп рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд░рдЦрд░рдЦрд╛рд╡ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд░ рдореИрдВ toEqual рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рджрд╛рд╡реЗ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдЕрдиреНрдпрдерд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдПрдХ рдХрд╕реНрдЯрдо рдореИрдЪрд░ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ ?!

рдЬрдмрдХрд┐ рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ it.each рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, рдПрдХ рджрд╛рд╡реЗ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд░реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдЪрд░реНрдЪрд╛ рдФрд░ jest-expect-message рдЙрднрд░рдирд╛ рдореБрдЭреЗ рдЬреИрд╕реНрдореАрди рдореЗрдВ beforeAll рдореБрджреНрджреЗ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ...

рдореИрдВ рдпрд╣рд╛рдВ рдУрдкреА рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдЧрд▓рдд рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдореИрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд▓рд╛рдпрд╛ рдерд╛, рдЙрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдзрд╛рд░рдг try / catch рдФрд░ рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ jest.expect ред рдореИрдВ рдХреЗрд╡рд▓ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдкреВрд░реНрдгрддрд╛ рдХреЛ рд▓реЙрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрд┐рдирдХреА рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА рдмрдирд╛рдо рдЬреЛ рдореБрдЭреЗ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рдереА + рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рд▓реЙрдЧ рдЬреЛ рдорд╣рддреНрд╡ рдХреЛ рд╕рдордЭрд╛рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЗрд╕реЗ рдЖрдк рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

in some test utility file...

const myExpect = (expectFn, errorCallback) => {
  try {
    expectFn();
  } catch (err) {
    errorCallback();
    throw new Error(err);
  }
};

// in the actual test suite...

const context = { hello: "world", results, expected };
myExpect(
    () => expect(results).toEqual(expected),
    () => console.error("[Error] -- context:", JSON.stringify(context))
);

+1
рдирдорд╕реНрддреЗ, рдореБрдЭреЗ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд▓рдЧреЗрдЧреАред рдпрд╣ рдореЗрд░реЗ рдЬреАрд╡рди рдХреЛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред

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

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

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

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

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

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

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