рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп рдЕрдкреНрд░рд┐рдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ

рджреВрд╕рд░реЗ рджрд┐рди, рдореИрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЙрди рдЕрдкреНрд░рд┐рдп рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдЬреЛ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦрддреЗ рд╕рдордп рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рдмрд╕реЗ рдЕрдкреНрд░рд┐рдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рддрдм рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╡реЗ рдРрд╕рд╛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рд╕ рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдФрд░ рдореИрдВрдиреЗ рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕рднреА рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдФрд░ рдмрддрд╛рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг Node.JS рдФрд░ Mocha рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИрдВред

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


рддреЛ рдЪрд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВред

0. рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдХрдореА


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

1. рдЪрд▓ рд░рд╣реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдХрдореА


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

2. рдХрд╡рд░реЗрдЬ рдХрд╛ рдЕрднрд╛рд╡


рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдХрд╡рд░реЗрдЬ рд╣реИ, рддреЛ рдЕрднреА рдЬрд╛рдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдХрдо рд╕реЗ рдХрдо рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ ред рдЕрдиреНрдпрдерд╛, рдПрдХ рдЕрдЪреНрдЫрд╛ рдореМрдХрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдкрд░реАрдХреНрд╖рдг 10% рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдкрд░ рдХрджрдо рд░рдЦреЗрдВрдЧреЗред рдмреЗрд╢рдХ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреЛрдб рдХрд╛ 100% рдХрд╡рд░реЗрдЬ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХреА рдкреВрд░реНрдг рд╢реБрджреНрдзрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╡рд░реЗрдЬ рдХреА рдХрдореА рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдПрдЧрд╛ред рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рдХрд┐ Node.JS рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рднреА рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдкрдХрд░рдг рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрд╡рд░реЗрдЬ рдХрд╛ рд╡рд┐рд╖рдп рдЧрд╣рд░рд╛ рдФрд░ рдЕрддреНрдпрдВрдд рд╕рдордЧреНрд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдЧрд╣рд░рд╛рдИ рддрдХ рдирд╣реАрдВ рдЬрд╛рддрд╛ - рдореИрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

3ред



const {assert} = require('chai'); const Promise = require('bluebird'); const sinon = require('sinon'); class MightyLibrary { static someLongFunction() { return Promise.resolve(1); // just imagine a really complex and long function here } } async function doItQuickOrFail() { let res; try { res = await MightyLibrary.someLongFunction().timeout(1000); } catch (err) { if (err instanceof Promise.TimeoutError) { return false; } throw err; } return res; } describe('using Timeouts', ()=>{ it('should return false if waited too much', async ()=>{ // stub function to emulate looong work sinon.stub(MightyLibrary, 'someLongFunction').callsFake(()=>Promise.delay(10000).then(()=>true)); const res = await doItQuickOrFail(); assert.equal(res, false); }); }); 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдореЗрдВ рдЯрд╛рдЗрдордЖрдЙрдЯред

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



4ред



 const fs = require('fs'); const testData = JSON.parse(fs.readFileSync('./testData.json', 'utf8')); describe('some block', ()=>{ it('should do something', ()=>{ someTest(testData); }) }) 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рдкрд░реАрдХреНрд╖рдг рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд╣рд░ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИред

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



5ред



 const {assert} = require('chai'); const sinon = require('sinon'); class Dog { // eslint-disable-next-line class-methods-use-this say() { return 'Wow'; } } describe('stubsEverywhere', ()=>{ before(()=>{ sinon.stub(Dog.prototype, 'say').callsFake(()=>{ return 'meow'; }); }); it('should say meow', ()=>{ const dog = new Dog(); assert.equal(dog.say(), 'meow', 'dog should say "meow!"'); }); }); 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯрдмреНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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



6ред



 const sinon = require('sinon'); const {assert} = require('chai'); class Widget { fetch() {} loadData() { this.fetch(); } } if (!sinon.sandbox || !sinon.sandbox.stub) { sinon.sandbox = sinon.createSandbox(); } describe('My widget', () => { it('is awesome', () => { const widget = new Widget(); widget.fetch = sinon.sandbox.stub().returns({ one: 1, two: 2 }); widget.loadData(); assert.isTrue(widget.fetch.called); }); }); 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ред

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡реЗ рдпрд╣рд╛рдБ рд▓рд┐рдЦрдирд╛ рднреВрд▓ рдЧрдП

  afterEach(() => { sinon.sandbox.restore(); }); 


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

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ sinon.sandbox рдХреЛ рдкрджрд╛рд╡рдирдд рдФрд░ рдмрд╛рд╣рд░ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд░рд╛рд╕рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд░реНрджрдирд╛рдХ рд░реВрдк рд╕реЗ рджрд░реНрджрдирд╛рдХ рд╣реЛред рдХреМрди рд╕рд╛ рдХреЛрдб рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рджреЛрд╖реА рд╣реИред рд╡реИрд╕реЗ, рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╣рдм рдкрд░ "рдЖрдЗрд╕ рдлреИрдХреНрдЯреНрд░реА" рдЬреИрд╕реЗ рдХрд┐рд╕реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ рдереА - рдпрд╣ рдПрдХ рд░рд╛рдордмрд╛рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред




7. рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд┐рд╢рд╛рд▓ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛



рдмрд╣реБрдд рдмрд╛рд░ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХрд┐рддрдиреА рдмрдбрд╝реА JSON рдлрд╛рдЗрд▓реЗрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ XML, рд╕реАрдзреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд░рдЦрдирд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рджреЗрдЦрдиреЗ, рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд░реНрджрдирд╛рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рдЖрдИрдбреАрдИ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж рдирд╣реАрдВ рджреЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрдбрд╝рд╛ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВред

8ред


 const {assert} = require('chai'); const crypto = require('crypto'); describe('extraTests', ()=>{ it('should generate unique bytes', ()=>{ const arr = []; for (let i = 0; i < 1000; i++) { const value = crypto.randomBytes(256); arr.push(value); } const unique = arr.filter((el, index)=>arr.indexOf(el) === index); assert.equal(arr.length, unique.length, 'Data is not random enough!'); }); }); 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░реАрдХреНрд╖рдгред

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

рдЦреИрд░, рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рдИ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рдЕрд╕реНрдерд┐рд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдкреИрд░ рдореЗрдВ рдЧреЛрд▓реА рдорд╛рд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред



9. рдореЛрдХ рдХреА рдХрдореА


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

11ред


 const {assert} = require('chai'); class CustomError extends Error { } function mytestFunction() { throw new CustomError('important message'); } describe('badCompare', ()=>{ it('should throw only my custom errors', ()=>{ let errorHappened = false; try { mytestFunction(); } catch (err) { errorHappened = true; assert.isTrue(err instanceof CustomError); } assert.isTrue(errorHappened); }); }); 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐ рдбрд┐рдмрдЧрд┐рдВрдЧред

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

1) badCompare
should throw only my custom errors:

AssertionError: expected false to be true
+ expected - actual

-false
+true

at Context.it (test/011_badCompare/test.js:23:14)


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



12ред


 const {assert} = require('chai'); function someVeryBigFunc1() { return 1; // imagine a tonn of code here } function someVeryBigFunc2() { return 2; // imagine a tonn of code here } describe('all Before Tests', ()=>{ let res1; let res2; before(async ()=>{ res1 = await someVeryBigFunc1(); res2 = await someVeryBigFunc2(); }); it('should return 1', ()=>{ assert.equal(res1, 1); }); it('should return 2', ()=>{ assert.equal(res2, 2); }); }); 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рдкрд╣рд▓реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рдм рдХреБрдЫред

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



13ред


 const {assert} = require('chai'); const moment = require('moment'); function someDateBasedFunction(date) { if (moment().isAfter(date)) { return 0; } return 1; } describe('useFutureDate', ()=>{ it('should return 0 for passed date', ()=>{ const pastDate = moment('2010-01-01'); assert.equal(someDateBasedFunction(pastDate), 0); }); it('should return 1 for future date', ()=>{ const itWillAlwaysBeInFuture = moment('2030-01-01'); assert.equal(someDateBasedFunction(itWillAlwaysBeInFuture), 1); }); }); 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рддрд╛рд░реАрдЦреЛрдВ рдкрд░ рдмрд╛рдБрдзред

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

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдХреЛрдИ рднреА рддрд╛рд░реАрдЦ рдЬрд▓реНрдж рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЖрдПрдЧреА - рдЗрд╕рд▓рд┐рдП рдпрд╛ рддреЛ 'sinon.fakeTimers` рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдордп рдХреЗ рдЕрдиреБрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ 2050 рдЬреИрд╕реА рдХрдо рд╕реЗ рдХрдо рджреВрд░рд╕реНрде рддрд┐рдерд┐рдпреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ - рдЕрдкрдиреЗ рд╡рдВрд╢рдЬреЛрдВ рдХреЛ рдЪреЛрдЯ рд▓рдЧрдиреЗ рджреЗрдВ ...



14ред



 describe('dynamicRequires', ()=>{ it('should return english locale', ()=>{ // HACK : // Some people mutate locale in tests to chinese so I will require moment here // eslint-disable-next-line global-require const moment = require('moment'); const someDate = moment('2010-01-01').format('MMMM'); assert.equal(someDate, 'January'); }); }); 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рдореЙрдбреНрдпреВрд▓ рдХреА рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд┐рдВрдЧред

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



15ред


 function someComplexFunc() { // Imagine a piece of really strange code here return 1; } describe('cryptic', ()=>{ it('success', ()=>{ const result = someComplexFunc(); assert.equal(result, 1); }); it('should not fail', ()=>{ const result = someComplexFunc(); assert.equal(result, 1); }); it('is right', ()=>{ const result = someComplexFunc(); assert.equal(result, 1); }); it('makes no difference for solar system', ()=>{ const result = someComplexFunc(); assert.equal(result, 1); }); }); 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рдЕрд╕рдВрдЧрдд рдкрд░реАрдХреНрд╖рдг рдирд╛рдоред

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



16ред


 const {assert} = require('chai'); const Promise = require('bluebird'); function someTomeoutingFunction() { throw new Promise.TimeoutError(); } describe('no Error check', ()=>{ it('should throw error', async ()=>{ let timedOut = false; try { await someTomeoutingFunction(); } catch (err) { timedOut = true; } assert.equal(timedOut, true); }); }); 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЕрднрд╛рд╡ред

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



17ред



 function someBadFunc() { throw new Error('I am just wrong!'); } describe.skip('skipped test', ()=>{ it('should be fine', ()=>{ someBadFunc(); }); }); 


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ
рд╡рд┐рдХрд▓рд╛рдВрдЧ рдкрд░реАрдХреНрд╖рдгред

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



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

Source: https://habr.com/ru/post/hi432092/


All Articles