Mocha: рддреНрд░реБрдЯрд┐: рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╡рд┐рдзрд┐ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдЕрдЧре░ 2016  ┬╖  84рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mochajs/mocha

рдпрд╣:

before(done => {
    return Promise
        .all([])
        .then(() => Model.insert(...)) // Bookshelf model returning a Bluebird Promise
        .then(() => done())
        .catch(done)
})

Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both. рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА

рдбреЙрдХреНрд╕ рдХрд╣рддреЗ рд╣реИрдВ:

Mocha v3.0.0 рдФрд░ рдирдП рдореЗрдВ, рдПрдХ рд╡рд╛рджреЗ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдФрд░ рдХреЙрд▓ рдХрд░рдиреЗ () рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЧрд▓рддреА рд╣реИ:

рдореЙрдбрд▓ рдХреЙрд▓ рдирд╡ рд╕рдореНрдорд┐рд▓рд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ Promise.<Object> рдХреЗ рд╕рд╛рде рд╣рд▓ рд╣реЛ рд░рд╣реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ рдореИрдВ .then(() => done()) рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдкрд░реАрдХреНрд╖рдг рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

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

async рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде done рднреА рдЯреВрдЯрддреЗ рд╣реИрдВред

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

async рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде done рднреА рдЯреВрдЯрддреЗ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк meaning 0 рдХреА рдЕрд░реНрде рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд╣реАрдВ рд╣реИрдВ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ done рдХреЙрд▓рдмреИрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ), _and_ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ return рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рдЖрдк рд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп done рдХреЙрд▓рдмреИрдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рдирд┐рд░реНрдорд╛рдг рд╣реЛрдЧрд╛ред :

before(() => Promise.all([]).then(() => Model.insert(...)));

рдпрд╣рд╛рдБ рджреЛрдиреЛрдВ async (рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╡рд╛рджрд╛) рдФрд░ done рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ:

it('fires change event when calling blah.doSomethingThatFiresChange', async function (done) {
  const blah = await getBlah()
  blah.on('change', () => done())
  blah.doSomethingThatFiresChange()
})

@elado рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЛрдЪрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдпрд╣ рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рд╣реИ - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рджреЛрдиреЛрдВ done рдХреЙрд▓рдмреИрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╛рджрд╛-рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛:

it('fires change event when calling blah.doSomethingThatFiresChange', async function () {
  const blah = await getBlah()
  return new Promise(resolve => {
    blah.on('change', resolve)
    blah.doSomethingThatFiresChange()
  })
})

... рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ рдХрд┐ рдореЛрдЪрд╛ _both_ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдХреЙрд▓рдмреИрдХ рдХрд╣рд╛ рдЬрд╛рдП?

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

... рдЕрдЧрд░ рдореИрдВ .iten (ред) (> = рдХрд┐рдпрд╛ ()) рддреЛ рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдпрд╣ рдПрдХ рдмрдЧ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВред

@ScottFreeCode рд╣рдореНрдо, рд╣рд╛рдБ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ "рдУрд╡рд░рд╕реНрдкреАрдб" рддреНрд░реБрдЯрд┐ рдХреЛ done рдХреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: https://github.com/mochajs.mocha/blob/4944e31ff60105815f4b314996a373/73/7373 runnable.js # L357 -L373

... рд▓реЗрдХрд┐рди рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реА рд╣рдореЗрдВ рдЙрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рд╣реИред

@ScottFreeCode рдпрд╣рд╛рдВ рдХреНрдпрд╛ рддрдп рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рд╣рд▓ рдХрд░рдиреЗ рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд╡рд╛рджреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдлрд┐рд░ 'рдУрд╡рд░рд╕реНрдкреАрд╕реАрдлрд╛рдЗрдб' рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ?"

рдпрджрд┐ рд╣рдо рдПрдХ рд╣реА рдкрд░реАрдХреНрд╖рдг рдореЗрдВ done рдкреНрд▓рд╕ рдХреЗ рд╡рд╛рджреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдРрд╕рд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд▓реНрдж рд╣реА рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ done рд░рд┐рдЯрд░реНрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рд╡рд╛рджрд╛, @papandreou рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред рдЬрдм рддрдХ рд╣рдо рд╡рд╛рджреЛрдВ рдФрд░ done рдХреЛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддрдм рддрдХ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореБрдЭреЗ рдХрд┐рди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред

@ScottFreeCode рдореИрдВ рд╕рд╣рдорддрд┐ рдореЗрдВ рд╣реВрдВред рддреЛ рдпрд╣

  1. рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ; Error рддреБрд░рдВрдд done() рдХреЙрд▓ рди рдХрд░реЗрдВ
  2. рд╡рд╛рджрд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВ
  3. Error рд╕рд╛рде рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ

рдмреЛрдирд╕ рдкреНрд░рд╢реНрди: рд╡рд╛рджреЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?

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

рдХреНрдпрд╛ рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рднреА рд╡рд╛рджрд╛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдпрд╛ рдЦрд╛рд░рд┐рдЬ рдХрд┐рдП рдмрд┐рдирд╛ done рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдпрд╣ рдПрдХ рдФрд░ рдЕрдВрддрд┐рдо рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред

рдореЗрд░рд╛ рдЭреБрдХрд╛рд╡, рдлрд┐рд░ рд╕реЗред рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рд╕рдордп рд╕реЗ рдмрд╛рд╣рд░ (рдмрд┐рдирд╛ ___ done рдпрд╛ рд╣рд▓ рдХрд┐рдП рдЧрдП / рд╡рд╛рджреЗ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛) рд╣рдореЗрдВ рдмрд╕ done рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рддрд┐рдЬреНрдЮрд╛ рдХреЗ рд╕рд╛рде рджреЗрдиреА рдЪрд╛рд╣рд┐рдП (рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдпреЛрдЬрди рдкрд░ рднреНрд░рдо рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрднреА рднреА рдПрдХ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛), рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ рддреЛ рд╕рдВрднрд╡рддрдГ рдкрд░рд┐рдгрд╛рдо рдорд╛рдиреНрдп рд╣реИ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рддрд░рд╣ рд╕рд╛рд░реНрдердХ) рдФрд░ рд╣рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рджреЛрдиреЛрдВ done рдХрд╛ рд╕рдВрднрд╡рддрдГ рдЧрд▓рдд рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд╛рде рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рднреА рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдХрд┐ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдорджрджрдЧрд╛рд░ рд╣реИред

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

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

рдпрд╣ _conceivable_ рд╣реИ рдХрд┐ рдХреЛрдИ рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (Bluebird рдХреЗ рд╕рд╛рде):

// to make this work, you need to omit `return`
it('should do something async for sure', function(done) {
  return somethingAsync()
    .then(makeAssertion)
    .asCallback(done);
});

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдХреБрдЫ рд╣реИ рдЬреЛ рдЖрдк _could_ рдХрд░рддреЗ рд╣реИрдВ; рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдПрдХ рдмрдЧ рд╣реИред

рдпрд╣ "рдЦрд░рд╛рдм рдпреВрдЖрдИ" -рдкреНрд░рдХрд╛рд░ рдХреЗ рдореБрджреНрджреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ

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

it("should not time out", function(done) {
  return new Promise(function(resolve, reject) {
    setTimeout(resolve.bind(42), 50)
  })
})

1) рд╕рдордп рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
рддреНрд░реБрдЯрд┐: 2000 рдореА рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдкреАрдЖрд░ рдХреЛ рджреЗрдЦреВрдВрдЧрд╛ ...

рдЗрдЪреНрдЫреБрдХ рдкрд╛рд░реНрдЯрд┐рдпреЛрдВ рдХреЛ # 2413 рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

@ рдмреНрд░рд╛рдпрдирд╕рд┐рдкрд▓

рдореБрдЭреЗ рд╕рдВрд╕реНрдХрд░рдг 3 рдореЗрдВ рдХрдИ async beforeEach рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:

  beforeEach((cb) => connection.db.collection('users').remove({}, cb));
  beforeEach((cb) => connection.db.collection('accounts').remove({}, cb));
  beforeEach((cb) => connection.db.collection('accounts').insertOne(account1, cb));

рдХреНрдпрд╛ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдЕрднреА рднреА рдПрд╕рд┐рдВрдХреНрд╕ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ?

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдореБрджреНрджреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛: рдкреНрд░рддреНрдпреЗрдХ рд╣реБрдХ рдХреЗ рдЕрдВрджрд░ рдореЗрд░реЗ рддрд░реАрдХреЗ promise рд▓реМрдЯ рд░рд╣реЗ рд╣реИрдВ (рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛) рдФрд░ рдЬрд╛рд╣рд┐рд░ рд╣реИ рдореИрдВ cb рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рднреА рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реВрдВред ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджрд┐рдП рд╣реИрдВред рдпрд╣рд╛рдБ рддреНрд░реБрдЯрд┐ рд╕рд┐рд░реНрдл рдПрдХ рдЭреБрдВрдЭрд▓рд╛рд╣рдЯ рд╣реИред рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВред

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

рдЬрдм рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╕реНрддреБ рд╣реЛрддреА рд╣реИ
рд▓реМрдЯреЗ, рд░рдирдиреЗрдмрд▓ рдХреА рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╕реНрдерд┐рддрд┐ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред

рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╣ рдХреИрд╕рд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ?

рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ @RobertWHurst рдпрд╣рд╛рдБ рдХреЛрдИ рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

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

рд╣рдордиреЗ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ _force_ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╣рдордиреЗ рдПрдХ рдкреНрд░рдореБрдЦ рдЬрд╛рд░реА рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдВрдЧреЗред рд╣рдордиреЗ рд╕реЗрдорд░ рдирд╣реАрдВ рддреЛрдбрд╝рд╛ред

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

beforeEach((cb) => connection.db.collection('users').remove({}, cb));
            ^^

^ ^ рдЬреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд▓реЗрдЦрдХ рдХреЛ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рд╣реИред рд▓реЗрдЦрдХ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИред

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

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

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

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

рдЬреИрд╕рд╛ рдХрд┐ babel async / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдирдП mocha @ 3 рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

it('should fill userName and password', async function (done) {
    const userNameField = global.driver.wait(until.elementLocated({css: '#username'}));
    userNameField.sendKeys('admin');

    const passNameField = global.driver.findElement({css: '#password'});
    passNameField.sendKeys('*******');

    const userNameVal = await userNameField.getAttribute('value');
    const passwordVal = await passNameField.getAttribute('value');

    try {
      assert.equal(userNameVal, 'admin');
      assert.equal(passwordVal, 'changeme');
    } catch (error) {
      done(error);
      return;
    }

    done();
  });

рдпрд╣ рдХреЛрдб mocha @ 2 рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди mocha @ 3 рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ await рдпрд╣ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреАрдЖрд░ рдпрд╣рд╛рдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ => https://github.com/mochajs/mocha/pull/2413
рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ред

@artyomtrityak рдпрд╣ рдПрдХ рдорд╣рд╛рди рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдБ done рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред

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

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

рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рдЪрдирд╛рддреНрдордХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ OSS рд╣реИ - рдЖрдк рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХрд╛рдВрдЯрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

@boneskull рдпрд╣ async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рджреЗ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рдЕрдкрдирд╛ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдЬрдм рд╡рд╛рджрд╛ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреБрдЫ рдХрд╕реНрдЯрдо рдЪреЗрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдХреЛрдб mocha @ 2 рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди mocha @ 3 рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореЗрд░реА рдЯреАрдо (~ 20ppl) рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдирд╡реАрдирддрдо рдореЛрдЪрд╛ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреА рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЛрдЪрд╛ 2.x рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХрд╛ рдХреЛрдИ рддрдХрдиреАрдХреА рдХрд╛рд░рдг рд╣реИ?

@artyomtrityak рдпрд╣ рдПрдХ рдорд╣рд╛рди рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдБ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмреЗрдмрд▓ async/await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдмрд┐рдирд╛ return new Promise ?

@artyomtrityak рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╛рджреЛрдВ рдХреЛ рдЧрд▓реЗ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ? рддреЛ рдЖрдк рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЫреЛрдЯрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

it('should fill userName and password', async function () {
    const userNameField = global.driver.wait(until.elementLocated({css: '#username'}));
    userNameField.sendKeys('admin');

    const passNameField = global.driver.findElement({css: '#password'});
    passNameField.sendKeys('*******');

    const userNameVal = await userNameField.getAttribute('value');
    const passwordVal = await passNameField.getAttribute('value');

    assert.equal(userNameVal, 'admin');
    assert.equal(passwordVal, 'changeme');
  });

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

рдЖрдк рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдЕрдиреБрдЪрд░) рдиреЗ рдореЛрдЪрд╛ рдкрд░ 2014 рдХреЗ рдордзреНрдп рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛ред рдореЛрдЪрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдерд╛ рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рд▓реЛрдЧреЛрдВ рдиреЗ рдпреЛрдЧрджрд╛рди рджреЗрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реА рд░рд╛рдп рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ рдпрд╣ рд╕реЛрдЪрдХрд░ рдЕрдХреЗрд▓рд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕реА рд╕реНрдерд╛рдкрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЙрдЪрд┐рдд рди рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рдореВрд▓ рдФрдЪрд┐рддреНрдп рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдПрдХ рдЕрдВрдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдкреВрдЫрдирд╛ рд╕реНрдкрд╖реНрдЯ рдЗрд░рд╛рджреЗ рдХрд╛ рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рджреЗ рдЙрддрдиреЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирд╕реЗ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдФрд░ рджреБрд░реНрдШрдЯрдирд╛рд╡рд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рддреГрддреАрдп рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛)ред рдЗрди рднрд┐рдиреНрдирддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдЙрдкрдЬ рджреЗрдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдХреЙрд▓рдмреИрдХ рдХреЛ рдкрд░реАрдХреНрд╖рдг рддрд░реНрдХреЛрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдкреВрдЫрдХрд░, рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рдП рд╣реИрдВред рдЖрдкрдХреЗ рд╕рдореБрджрд╛рдп рдиреЗ рдЗрди рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдЙрдард╛рдпрд╛, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд┐ рдЖрдк рд▓реЛрдЧ рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рджреЛрдЧреБрдирд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП async рд╣реЛрдиреЗ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рджреЗрдЦреЗрдВ => https://github.com/mochajs/mocha/pull/2413 рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЧрд▓рддреА рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред

рдЖрдк рд▓реЛрдЧреЛрдВ рдиреЗ @tj рдХреЗ рдкреНрд░рд╕реНрдерд╛рди рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдкреВрд░реА рддрд░рд╣ рд╕реЗ @RobertWHurst рд╕реЗ рд╕рд╣рдордд рд╣реИрдВред

done рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд╛рджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ done рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ async рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдПрдХ рдЖрджрд░реНрд╢ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред

рдКрдкрд░ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ:

it('fires change event when calling blah.doSomethingThatFiresChange', async function (done) {
  const blah = await getBlah()
  blah.on('change', () => done())
  blah.doSomethingThatFiresChange()
})

рдЬреИрд╕рд╛ рдХрд┐ рдЕрдзрд┐рдХ рд▓реЛрдЧ ES6 / 7 + async / await рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рдпрд╣ рдореЛрдЪрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЖрдо рдЧреЗрдЯрд╛ рдмрди рдЬрд╛рдПрдЧрд╛ред

рдХреГрдкрдпрд╛ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

@RobertWHurst рдЖрдк рддрд░реНрдХ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ done рдХреЙрд▓рдмреИрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рдЗрд░рд╛рджрд╛ рд╣реИред рдХреНрдпрд╛ рдПрдХ return рдмрдпрд╛рди рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ? рджреЛрдиреЛрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╣рдо рдХреИрд╕реЗ рддрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдФрд░ рджреВрд╕рд░рд╛ рдирд╣реАрдВ рд╣реИ? рдпрджрд┐ рдЖрдк () => foo рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рджреБрдирд┐рдпрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдИ рднреА рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рдЖрдк рд╕рднреА рд╣рдерд┐рдпрд╛рд░ рдЙрдард╛ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдирд┐рд╣рд┐рдд рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕реМрдВрджрд░реНрдпрд╡рд╛рджреА рдХрд╛рд░рдг рд╣реИрдВред

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

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ

@Munter рддрд╕реНрд╡реАрд░ рдореЗрдВ async рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЦреЛрдЬреЗ рдЧрдП рдкреИрдорд╛рдиреЗ рдкрд░ рд░рд┐рдЯрд░реНрди рдХрд┐рдП рдЧрдП рд╡рд╛рджреЗ рдХрдо рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рдЖрдк await рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ рдирд╣реАрдВ:

it('should work with a async function that could have been sync', async function () {
  assert.ok(true);
});

it('should work with a legitimately async function', async function () {
  assert.equal(await getBlah(), 'blah');
});

it('should work with a fully spelled-out Promise-based test', function () {
  return getBlah().then(function (blah) {
    assert.equal(blah, 'blah');
  });
});

рдФрд░ рдлрд┐рд░ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реИ:

it('should foo', async function (done) {
  assert.equal('foo', 'foo');
  done();
});

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

рдпрд╣рд╛рдБ рдкрд░ рдереЛрдбрд╝реА рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рдж => https://github.com/mochajs/mocha/pull/1320, рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ред рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рдкрд░ рдЖрдкрдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдЬреЛрдбрд╝рд╛ рд╣реИ => https://github.com/mochajs/mocha/poc/654

:рдмрд┐рдпрд░:

рдЖрдк рддрд░реНрдХ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдХрд┐рдП рдЧрдП рдХреЙрд▓рдмреИрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рдЗрд░рд╛рджрд╛ рд╣реИред рдХреНрдпрд╛ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ?

@ рдореВрдирд░ рдЙрд╕ рдХреЙрдлрд╝рд┐рд╢рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ es6 рдПрд░реЛ рдлрдВрдХреНрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рдиреНрд╕ рдХреЛ рдирд╣реАрдВ рднреВрд▓рддреЗ рд╣реИрдВ, _implicitly_, рддрд╛рдХрд┐ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХреЗрдВ

it 'should foo', (done) -> request('/foo').end (err, res, body) -> done()

рдФрд░ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрд╕ рдЕрдЪреНрдЫреЗ рд╡рди-рд▓рд╛рдЗрдирд░ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛

it 'should foo', (done) ->
  request('/foo').end (err, res, body) -> done()
  return

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдФрд░ рдореЗрдХреЛрдиреЛ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рдордЧреНрд░ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЛ:

it 'should foo', (done) ->
  obj =
    run: ->
      done()
      @
    then: -> "what the hell, i'm not a promise"
  obj.run()

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

рд╕рднреА рдХреЛ рдкреНрд░рдгрд╛рдо,
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛;

describe('Page', ->
  describe('/GET home', ->
    it('it SHOULD return the homepage', (done) ->
      chai.request(app).get('/').end((err, res) ->
        res.should.have.status(200)
        res.text.should.be.a('string')
        done()
      )
    )
  )
)

рдпрд╣ рд╡рд╛рджрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдХреЗ рдФрд░ рдХреЙрд▓рдмреИрдХ done() рдХреЛ рдЫреЛрдбрд╝ рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

describe('Page', ->
  describe('/GET home', ->
    it('it SHOULD return the homepage', ->
      chai.request(app).get('/').then((res) ->
        res.should.have.status(200)
        res.text.should.be.a('string')
      )
    )
  )
)

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рдорд╛рди рддреНрд░реБрдЯрд┐ рдореЗрдВ рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВ: рдореБрд╕реНрдХрд╛рди:

PS : рджрд┐рд▓: рдореЛрдЪрд╛ btw: +1:

EDIT @Munter рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ catch() рдирд┐рдХрд╛рд▓реЗрдВред

@karlbateman рдзрдиреНрдпрд╡рд╛рдж рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдкрдХреЛ рдЙрд╕ рдЕрдВрддрд┐рдо .catch рдирд╣реАрдВ рд╣реИред рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рд╡рд╛рджреЗ рдХреЛ рдореЛрдЪрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ

@ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ, рдзрдиреНрдпрд╡рд╛рдж: рд╕реНрдорд╛рдЗрд▓реА:

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрдиреЗ рдкрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рджреЗ рдФрд░ рдХреЙрд▓рдмреИрдХ рджреЛрдиреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд╕рдВрдж рд╣реИред рдХреНрдпрд╛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рдереА?

@ light24bulbs рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдирд╣реАрдВ, afaik рдХрд┐рд╕реА рдиреЗ рднреА рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ред рдореИрдВ рдЕрднреА рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдИ рд╣реИ, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЖрджрд┐ред

рдХреНрдпрд╛ рдмрд╛рдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдХреНрдпрд╛ рдмрд╛рдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдореИрдВ рджреЛ рдмрд╛рд░ рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВ:

it("should work", done => {
  (async () => {
    await something;
    done();
  })();
});

@SaschaNaz рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣

6 рдорд╣реАрдиреЗ рдмрд╛рдж, рдпрд╣ рдореБрджреНрджрд╛ рдЕрднреА рднреА рд╕рднреА рдЖрдзреБрдирд┐рдХ рдЬреЗрдПрд╕ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдмреНрд░реЗрдХ рдХрд░ рд░рд╣рд╛ рд╣реИ ...
рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ

@benfavre рдЙрддреНрд╕рд╛рд╣рдЬрдирдХ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд╡рдпрдВрд╕реЗрд╡рдХреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдирдХреЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рд╕реА рднреА рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред

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

=> рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд╛рджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдореЛрд░реНрдЯрд╛рд░ рдХреА рддрд░рд╣ рд╕рд┐рд░реНрдл "+1" рдЪрд╛рд╣рд┐рдП рддреЛ рдореБрдЭреЗ рдореБрдлреНрдд рдореЗрдВ рдЕрдкрдорд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореЗрд░реЗ рд╕рдВрджреЗрд╢ рдореЗрдВ рдХреБрдЫ рднреА рдЕрдкрдорд╛рдирдЬрдирдХ рдирд╣реАрдВ рдерд╛, рдореЗрд░реЗ рдХрдерди рдХрд╛ рд╕рд╣реА рдЕрд░реНрде рд╣реИред

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

рдирдпрд╛ рд╕рд╛рд▓ рдореБрдмрд╛рд░рдХ рд╣реЛ рдФрд░ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдореЗрдВ рдордЬрд╝рд╛ рдЖрдПред

рд╕рд░реНрдж...

рдЪрд░реНрдЪрд╛ done рдХреЙрд▓рдмреИрдХ рдФрд░ " Promise " рджреЛрдиреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдИ: https://github.com/mochajs/mocha/issues/2509

рд╕рдорд╛рдкрдиред # 2509 рджреЗрдЦреЗрдВ

рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рдирд┐рдХрд╛рдп рдЕрднреА рднреА рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ...

рдХреНрдпрд╛ рдмрд╛рдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдЕрдм # 2509 рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╡рд╛рджреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд┐рдд рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ wrapping twice hack рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:

it("should work", done => {
  (async () => {
    await something;
    done();
  })();
});

рдЗрд╕рдХреЗ рдмрджрд▓реЗ рдореЗрдВ, рд╣рдо рдмрд╕ рдЗрд╕ рдХреЗ рд╕рд╛рде рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

it("should work", async () => {
  await something;
});

рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ

@ рд▓реЛ-рдЯреА.рдкреА.
1.) рдпрд╣ рдХреЛрдб рддрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЗрд╕рдХреА рдХреЛрд▓рд╛рд╣рд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

it("should work", async () => {
  await something;
});

@ рд╕реЗрд░рдХрдирд╕реАрдкрд╣реА

  • рд╣рд╛рдВ, рдЕрдм async/await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмреЗрдмрд▓ рдХреА рдорджрдж рдЪрд╛рд╣рд┐рдПред

рдпрдХреАрди рдирд╣реАрдВ рд╣реЛрддрд╛ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдорд┐рд╕ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдХреЗ рдФрд░ рдмрд╕ () рдХрд┐рдпрд╛ рдЧрдпрд╛ рднрд░реЛрд╕рд╛ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред

рдпрд╣рд╛рдБ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ

  describe('STRIPE CHARGES: Get Charges', () => {
    it('should list customer charges', async () => {
      const charges = await Stripe.getChargesList(customerObj);
      charges.data[0].should.have.property('id');
      charges.data[0].amount.should.have.property('id');
    });
  });

рдореИрдВ chai.assert рдХреЗ рд╕рд╛рде mocha 4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ () рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

it('should throw an error', async function(done) {
  try {
    result = await something('value that causes something() to throw an Error');
    done('failed');
  } catch (e) {
    done();
  }
});

рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрд╕рдлрд▓ рд░рд╣рд╛

Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both."

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

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

it('should throw an error', async function() {
  try {
    result = await something('value that causes something() to throw an Error');
  } catch (e) {
    // how to indicate that this should happen, if I can't call done() to tell mocha?
  }
});

рдХреГрдкрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдореБрдЭреЗ рдЕрднрд┐рдХрдерди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд╛рд╣рд┐рдП?

рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдирд┐рдореНрди рд╕реНрддрд░ рдФрд░ рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рд╕рдорд╛рдзрд╛рди:

it('should throw an error', async function() {
  try {
    result = await something('value that causes something() to throw an Error');
    throw new Error('Promise unexpectedly fulfilled');
  } catch (e) {
    // Optionally assert something about e...
  }
});

рдореИрдВ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдХрд┐рд╕реА рднреА рджрд┐рди рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдБ:

const expect = require('unexpected');
it('should throw an error', async function () {
    await expect(something(), 'to be rejected with', 'the error message');
});

рдпрд╛ рдЪрд╛рдИ + рдЪрд╛рдИ-рдЬреИрд╕рд╛-рд╡рд╛рджрд╛:

const chai = require('chai');
chai.use(require('chai-as-promised'));
const expect = chai.expect;

it('should throw an error', async function () {
    await expect(something()).to.be.rejectedWith('argh');
});

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ, рдпрд╣ рдПрдХ asyncawait рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдмрд╕ omit 'рдХрд┐рдпрд╛ ()')

describe('New order from landing', function() {
    describe('check new client function', function () {
        it("must check db and return that random client is new", async function () {
            var result = await handler.checkClient(reqNewClient.body)
                expect(result).to.have.property('newclient').equal(true)
            })
    })
})

рдкрд░рд┐рдгрд╛рдо:

рд▓реИрдВрдбрд┐рдВрдЧ рд╕реЗ рдирдпрд╛ рдЖрджреЗрд╢
рдирдП рдЧреНрд░рд╛рд╣рдХ рд╕рдорд╛рд░реЛрд╣ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
тИЪ db рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЧреНрд░рд╛рд╣рдХ рдирдпрд╛ рд╣реИ
1 рдкрд╛рд╕рд┐рдВрдЧ (9 рдПрдордПрд╕)

@kolykhalov рдзрдиреНрдпрд╡рд╛рдж рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдПрдХ рдХреЛрд╢рд┐рд╢ / рдкрдХрдбрд╝ рдореЗрдВ async рдмреНрд▓реЙрдХ рд▓рдкреЗрдЯ рджрд┐рдпрд╛

it('It should activate a user.', async() => {
        return new Promise((resolve, reject) => {
            try {
                // Get the last activation token from the DB
                let sql = 'select * from activation_tokens order by created_at desc limit 1';
                let res = await DB.query(sql);
                let {token} = res[0];

                server
                    .post('/auth/activate')
                    .send({token})
                    .set('Content-Type', 'application/x-www-form-urlencoded')
                    .expect('Content-Type', /json/)
                    .expect(200)
                    .end((err, res) => {
                        res.body.data.should.contain.keys('message');
                        res.body.data.message.should.equal("Activated");
                        resolve();
                    });
            } catch (e) {
                console.error(e);
            }
        });
    });

рдХрдордЬреЛрд░рд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЕрдм рдореБрдЭреЗ 99 рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред рдПрдлрдПрдордПрд▓

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

it('should error on fn', async function(done) {
  try {
    await fn();
  } catch (e) {
    // assert some things here
    done()
  }
});

done рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдкрд░ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реБрдИ рддреЛ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкрд╛рд╕ рд╣реЛрдиреЗ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреБрдЫ рдиреЗ expect(await fn).to.throw('blah') рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдПрдХ-рд▓рд╛рдЗрдирд░ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЧреБрдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рдереА рд▓реЗрдХрд┐рди рдореИрдВ рдЧрд▓рддреА рд╕реЗ рдПрдХ рд╡рд╛рджрд╛ (рд╕реБрдкрд░рд░реНрдЯ) рд▓реМрдЯрд╛ рд░рд╣рд╛ рдерд╛

it('Should do something', (done) => {
       return supertest(server)
           .get(`/api/endpoint`)
           .set('somekey', 'somevalue')
           .expect(200)
           .then(() => { done(); })
           .catch(done);
});

'рд░рд┐рдЯрд░реНрди' рдХреНрд▓реЙрдЬ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ

рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕ рд╕реЗ рдкрд╛рдЧрд▓ рд╣реЛ рдЧрдпрд╛ рдерд╛ ...

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

it("should work", async () => {
  await something;
});

рдпрд╣ рдирд╣реАрдВ рдХрд░рддрд╛:

it("should work", async (done) => {
  await something;
});

рдЖрдкрдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ done рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред

@tamoyal , yeah - as elado рд╡рд╛рдкрд╕ 3 рдЕрдЧрд╕реНрдд 2016 рдХреЛ

рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдирд┐рд╣рд┐рдд Promise рдХрд╛ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИред done рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ
рд╕реАрдкреАрдПрд╕- рдЖрдзрд╛рд░рд┐рдд рдПрд╕реЗрдиреНрдб, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛
рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ рдФрд░ рдореЛрдЪрд╛-3.0 рд░рд┐рд▓реАрдЬ рдХреЗ рдмрд╛рдж рд╕реЗ рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рдереА рд▓реЗрдХрд┐рди рдореИрдВ рдЧрд▓рддреА рд╕реЗ рдПрдХ рд╡рд╛рджрд╛ (рд╕реБрдкрд░рд░реНрдЯ) рд▓реМрдЯрд╛ рд░рд╣рд╛ рдерд╛

it('should do something', (done) => {
       return supertest(server)
           .get(`/api/endpoint`)
           .set('somekey', 'somevalue')
           .expect(200)
           .then(() => { done(); })
           .catch(done);
});

'рд░рд┐рдЯрд░реНрди' рдХреНрд▓реЙрдЬ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ

@victorsferreira , рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рдзрд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ ...

it('should do something', () => {
  return supertest(server)
    .get(`/api/endpoint`)
    .set('somekey', 'somevalue')
    .expect(200);
});

@tamoyal Yep рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛

@mienaikoe , рдпрд╣ рд╕рдЯреАрдХ рдкрд░рд┐рджреГрд╢реНрдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ , рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ ...

@plroebuck рджреЛ рдмрд╛рддреЗрдВ:

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

2) рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рджреЛрд╖ рд╣реИ:

Mocha v3.0.0 рдФрд░ рдирдП рдореЗрдВ, рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рдпрд╛ рдФрд░ рдХрд┐рдпрд╛ () ...

рдпрд╣ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ done рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

@mienaikoe

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

рдПрдХ рдкрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдирд┐рд╖реНрдХрд╛рд╕рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рдЧрдпрд╛!

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ:

image

(рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!)

image

@QauseenMZ , рдЖрдкрдХреЗ "рдкрд╣рд▓реЗ" рдФрд░ "рдмрд╛рдж" рдХреЛрдб рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИред

рддреБрдо рднреА рдЕрдкрдирд╛ рд╡рд╛рджрд╛ рдирд╣реАрдВ рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реЛред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

  it('should receive successful RPC response', async () => {
    return await getResponse(unitData)
      .then((res) => {
        expect(res).to.have.status(200);
      });
  });

рдкреБрдирд╢реНрдЪред рдЖрдкрдХрд╛ рдиреЛрдб рдХреЙрд▓рдмреИрдХ рддрд░реНрдХ рдЖрджреЗрд╢ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ ... error _always_ рдкрд╣рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

@plroebuck рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рдЕрднреА рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВ рд╡рд╛рджрд╛ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ getResponse рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓рдмреИрдХ рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдореБрдЭреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдерд╛ред getResponse рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

image

рдпрд╣рд╛рдВ рдХреЙрд▓рдмреИрдХ getResponse рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреЗ рдХрд╛рд░рдг рддреНрд░реБрдЯрд┐ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдмрддрд╛рдПрдВред рдзрдиреНрдпрд╡рд╛рдж!

рдХреБрдЫ рднрд╛рдЧ рдереЛрдбрд╝реЗ рдЕрддрд╛рд░реНрдХрд┐рдХ рд▓рдЧрддреЗ рд╣реИрдВред рд╕рд┐рд░реНрдл рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд┐рд╕ request рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдЖрдкрдХреЛ options рдСрдмреНрдЬреЗрдХреНрдЯ (рдЖрдкрдХреЛ unitData ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА?

  • obj рдХрд╣рд╛рдБ рд╕реЗ рдЖрддрд╛ рд╣реИ?
  • рдХреНрдпреЛрдВ рдЖрдк рдПрдХ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ res.body.error рдПрдХ рд╕рд╛рде res.statusCode === 200 ?

рдкреБрдирд╢реНрдЪред рдХреГрдкрдпрд╛ рдХреЛрдб рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдХреЛрдб рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ ...

рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕ рд╕реЗ рдкрд╛рдЧрд▓ рд╣реЛ рдЧрдпрд╛ рдерд╛ ...

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

it("should work", async () => {
  await something;
});

рдпрд╣ рдирд╣реАрдВ рдХрд░рддрд╛:

it("should work", async (done) => {
  await something;
});

рдЖрдкрдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ done рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред

@tamoyal рдЖрдкрдиреЗ рдореЗрд░реА рдЬрд╛рди рдмрдЪрд╛рдИ <3

рдпрд╣ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реЛрддрд╛ рд╣реИ:

it('Location Querying Works', async () => {
    await WeatherComponent.pullLocationData();
    Vue.nextTick(()=>{
      expect(WeatherComponent.$el.textContent).contain("Spain")
    })
  })

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рддреЗрдЬрд╝ рд╕рдорд╛рдзрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдкреВрд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдПрдХ рд╡рд╛рджрд╛ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ, рдФрд░ resolve рдХреНрдпреЛрдВрдХрд┐ рдЖрдк done ред

рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░реЗрдВ:

it.only("Works with the database", async (done) => {
    let browser = await puppeteer.launch();
    let query = db.collection('lists').where('ownerId', '==', 'UJIXXwynaCj8oeuWfYa8');
    let ct = 0;
    query.onSnapshot(async querySnapshot => {
        if (ct === 0) {
            await addAPurpose(browser, session, sessionSig); // A function with a bunch of Puppeteer code.
            ct++
        } else {
            expect(querySnapshot.size).to.equal(1);
            expect(querySnapshot.docs[0].get().title).to.equal("Understand Mocha");
            done();
        }
        console.log(`Received query snapshot of size ${querySnapshot.size}`);
    }, err => {
        console.log(`Encountered error: ${err}`);
    });
});

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ:

it.only("Works with the database", async () => {
    const onSnap = new Promise(async (res, rej) => {
        let browser = await puppeteer.launch();
        let query = db.collection('lists').where('ownerId', '==', 'UJIo1gGMueoubgfWfYa8');
        let ct = 0;
        let unsubscribe = query.onSnapshot(async querySnapshot => {
            if (ct === 0) {
                await addAPurpose(browser, session, sessionSig);
                ct++
            } else {
                expect(querySnapshot.size).to.equal(1);
                expect(querySnapshot.docs[0].data().title).to.equal("Evolution");
                // done(); 
                unsubscribe();
                res();
            }
            console.log(`Received query snapshot of size ${querySnapshot.size}`);
        }, err => {
            console.log(`Encountered error: ${err}`);
            rej()
        });
    });
    return onSnap;
});

рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред

done рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдиреЗ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рддрдм рддрдХ рдЪрд▓рд╛ рдЬрдм рддрдХ рдмреБрд▓рд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рдпрд╛ рдЧрдпрд╛ async рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, async рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП _immediately_ рдпрджрд┐ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдореЛрдЪрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдлрд╝рдВрдХреНрд╢рди async рд╣реИ, рдФрд░
  2. done рддрд░реНрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ред

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

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк function.prototype.name === "AsyncFunction" рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдлрд┐рд░ рдпрд╣ рд╣реИ

if (function.prototype.name === "AsyncFunction && arg1.name === "done") {
  throw new Error("Can't use done with an async function")
}

рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдореИрдВ рдЗрд╕ рдкрд░ рд▓рдЧрднрдЧ SOL рдерд╛ред рдореБрдЭреЗ async рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд (рдХрднреА рднреА) рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИрдХ-рдП-рд░рд╛рдЙрдВрдб рдХреЛ рдПрдХ рдЖрддреНрдо-рдЖрдХреНрд░рдордг рд╡рд╛рд▓реЗ async рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдореЗрд░реЗ async рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЛ рд▓рдкреЗрдЯрдирд╛ рдерд╛, рд▓реЗрдХрд┐рди it func рдХреЛ рд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВред

рдЙрдкрд╛рдп:

it("It shouldn't be like this", function (done) {
    ( async function(){
        var life = require('InfiniteLife');
        var asyncRes = await life.someCoolstuff();
        assert(asyncRes);
        setTimeout( function(){
            done();
        },letsCallItQuitsNow);
    })();
});

рдмреНрд░реЗрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред

it('If the credentials exists in the system it should return the token generated against it.', async (done) => {
        let aObj = await admin.createAdmin();
        chai.request(server)
        .post("/authenticate")
        .set("Content-Type", "application/x-www-form-urlencoded")
        .send({username: aObj.login,password:aObj.password})
        .end((err, res) => {
            res.should.have.status(200);
            res.body.should.be.a("string");
            done();
        });
    });

рд╕рдлрд▓рддрд╛ рдХрд╛ рдорд╛рдорд▓рд╛

it('If the credentials exists in the system it should return the token generated against it.', async () => {
        let adminObj = await admin.createAdmin();
        chai.request(server)
        .post("/auth/login")
        .set("Content-Type", "application/x-www-form-urlencoded")
        .send({username: adminObj.login,password:adminObj.password})
        .end((err, res) => {
            res.should.have.status(200);
            res.body.should.be.a("string");
            // done();
        });
    });

@ Haisum92

рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рди рддреЛ done рдФрд░ рди рд╣реА async рд╣реИред рдЪрд╛рдп http рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореЛрдЪрд╛ рдХреЗ рдкрд░реАрдХреНрд╖рдг async рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

it('If the credentials exists in the system it should return the token generated against it.', () => {
  let adminObj = await admin.createAdmin();
  return chai.request(server)
    .post("/auth/login")
    .set("Content-Type", "application/x-www-form-urlencoded")
    .send({username: adminObj.login,password:adminObj.password})
    .end((err, res) => {
      res.should.have.status(200);
      res.body.should.be.a("string");
    });
});

@ рдиреИрдЯрдЬрд┐рдорд░

рдЖрдкрдХреЗ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╣реИ рдЕрдЧрд░ рдпрд╣ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд▓рдЧрддрд╛ рд╣реИред рдореЛрдЪрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИред

it("It should be liek this", async function () {
  this.timeout(letsCallItQuitsNow);

  var life = require('InfiniteLife');
  var asyncRes = await life.someCoolstuff();
  assert(asyncRes);
});

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

`рдПрдХреНрд╕рдкреНрд░реЗрд╕ / рдЬреЗрдПрд╕, рдФрд░ рдлрд╛рдпрд░рдмреЗрд╕ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдкреАрдЖрдИ рддреНрд░реБрдЯрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдлрд┐рд░ рдПрдХ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ .json рдФрд░ рдирд╣реАрдВред Send, рдореЛрдЪ рдХреЗ рд╕рд╛рде рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХреАрдбрд╝реЗ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рджреЗ рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк async рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддреЗ рд╣реИрдВ

  process.env.NODE_ENV='TESTING';
  const { FIREBASE_UID } = require('dotenv').config()?.parsed;
  const { red, green, white } = require('chalk');
  const chai = require('chai');
  const chaiHttp = require('chai-http');
  const server = require('../lib/api').API;
  const should = chai.should();
  const expect = chai.expect;
  chai.use(chaiHttp);
  const test = chai.request(server).keepOpen();

  const shouldPrint = (details, status) => {
      return white(`details: ${details}, status: ${status}`);
  };

describe('Authorization Middleware Error Check for bad token', () => {

    it(shouldPrint('Bad Request', red(400)), async () => {
        try {
            const res = await test.get('/').send()
            res.should.have.status(400);
            res.should.have.json
            const { details, status } = JSON.parse(res.text)
            expect(details).to.equal('Bad request')
            expect(status).to.equal(400)
        } catch (error) { 
            throw error 
        }
    })


    it(shouldPrint('Unauthorized', red(401)), async () => {
        try {
            const res = await test.get('/').set('Authorization', 'Bearer bad123token').send()
            res.should.exist
            res.should.have.status(401);
            res.should.have.json
            const { details, status } = JSON.parse(res.text)
            expect(details).to.equal('Unauthorized')
            expect(status).to.equal(401) 
        } catch (error) {
            throw error
        }
    })

})

 describe('Get token and ping', () => {
    let adminToken

    it(shouldPrint( 'Create custom jwt for testing', green(200)), async () => {
        try {
            const res = await test.get(`/createToken/${FIREBASE_UID}`).send()
            res.should.exist
            res.should.have.status(200);
            res.should.have.json
            adminToken = (JSON.parse(res.text)).token
        } catch (error) {
            throw error
        }
    })

    it(shouldPrint('PING', green(200)), async () => {
        try {
            const res = await test.get('/')
                .set('x-tenorders-testing', 'true')
                .set('Authorization', `Bearer ${adminToken}`).send()

            res.should.exist
            res.should.have.status(200);
            res.should.have.json
            const { details, status } = JSON.parse(res.text)
            expect(details).to.equal('PING')
            expect(status).to.equal(200)
        } catch (error) {
            throw error
        }   
    })

})
`

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

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

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

smithamax picture smithamax  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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

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