Jest: рдЕрдВрддрд┐рдо рдкрд░реАрдХреНрд╖рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЬреЗрд╕реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ рд╣реИ

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

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

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореИрдВ firebase-server рд╕рд╛рде рдлрд╛рдпрд░рдмреЗрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╣рд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╕рд░реНрд╡рд░ рдХрддрд╛рдИред afterEach рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рд╣рдо рдЕрдВрддрд┐рдо рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╕рднреА рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП close рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде рднреА рдЬреЗрд╕реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрднреА рднреА рдирд╣реАрдВ рдЫреЛрдбрд╝рддреА рд╣реИред

рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЬреЗрд╕реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ (рдкрд╛рд╕ рдпрд╛ рдЕрд╕рдлрд▓)? рдХреНрдпрд╛ рд╕рднреА рдмрдЪреЗ рд╣реБрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП afterAll рд╣реБрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ? рдХреНрдпрд╛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЗрд╕реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрд╛рдП рд░рдЦрддрд╛ рд╣реИ? рдзрдиреНрдпрд╡рд╛рджред

Enhancement Help Wanted good first issue

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

рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП --forceExit рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ЁЯОЙ

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

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдПрдХ рдбрд┐рдмрдЧрд░ (рдХреНрд░реЛрдо рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░) рдореЗрдВ рд╣реБрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд╕ рдХрд╛рд░реНрдп рдХреНрдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ Promise.prototyp.then рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреБрдЫ рдбрд╛рд▓реЗрдВ)

рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ async рдХрд╛рд░реНрдп рдХреЛ рддрдм рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕рднреА afterEach / after рд╣реБрдХ рдиреЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реЛ?

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдк рдореМрдЬреВрджрд╛ async рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдорд╛рд░реЗрдВрдЧреЗ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрди рдкрд░ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рд╣реИред

рдореИрдВрдиреЗ ava рд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдХреЛрдИ рдЙрддреНрддрд░ рд╣реЛ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ Node.js рдореЗрдВ process.exit рд╣реЛ

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

cc @dmitriiabramov рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ?

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

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

рджреВрд╕рд░рд╛ рдореБрджреНрджрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЫрдкрд╛рдИ рдЦрддреНрдо рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХрдЯреМрддреА рдХрд░ рд░рд╣рд╛ рд╣реЛред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкрд╣рд▓реЗ рдереА, рдЬрдм рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

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

рдПрдХ after all рд╣реБрдХ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдРрд╕реА рдХреЛрдИ рдЪреАрдЬ рдирд╣реАрдВ рджреЗрдЦреА рд╣реИ (рдХреЗрд╡рд▓ afterEach ) рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рднреА рдпрд╛рдж рдирд╣реАрдВ рд╣реИ?

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

рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХ рд╢реЛрдз рдХреЗ рдмрд╛рдж рдпрд╣ рдлрд╛рдпрд░рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рдФрд░ process.exit рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХрдореА рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рд╕рдВрд╕рд╛рдзрди:

рд╕рднреА рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдореЗрдВ process.exit рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдореИрдВ рдПрдХ рдЬреЗрд╕реНрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдбрд░рддрд╛ рд╣реВрдВ, рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЙрд▓ рд▓рдЧрд╛рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реИ? рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдерд╛:

afterAll(() => setTimeout(() => process.exit(), 1000))

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

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

рдореБрдЭреЗ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ рдбреНрд░реЛрди рдкрд░ рднреА
рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдпрд╣ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

  • рдЬреЗрд╕реНрдЯ рд╕рдВрд╕реНрдХрд░рдг : 15.1.1
  • рд╕реНрдерд╛рдиреАрдп :

    • рдиреЛрдб: 6.2.2

    • npm: 3.9.5

  • рдХреЛрдбрд╢рд┐рдк :

    • рдиреЛрдб: 6.5.0

    • npm: 3.10.3

  • Drone.io

    • рдиреЛрдб: 0.10.26

    • рдПрдирдкреАрдПрдо: 1.4.3

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореЗрд░реЗ рдкрд╛рд╕ --forceExitAfterTestRun рдирд╛рдордХ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреЛрдИ рдЖрд░рдХреНрд╖рдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: https://github.com/facebook/jest/blob/master/packages/jest-cli/src/cli/index.js#L41 рдЕрдЧрд░ рдЭрдВрдбрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдкрд░рд┐рдгрд╛рдоред

рддрд░рд╣-рддрд░рд╣ рдХреА рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд▓рдЧрддреА рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрд╡рд┐рдЯ рдХрд░рддрд╛ рд╣реИ ...

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

рдЬреИрд╕реНрдорд┐рди рдХреЗ рдкрд╛рд╕ --forceexit рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рд╣реЛрдЧреА рдЕрдЧрд░ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдЬреЗрд╕реНрдЯ to рдХреЗ рд▓рд┐рдП рднреА рднреВрдорд┐ рд╣реЛрдЧреА

рдПрдХ рдФрд░ рдореБрджреНрджрд╛ - рдпрджрд┐ рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ afterAll() рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рднреА рд╕рд╛рдл рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ --bail рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдРрд╕рд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ

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

рдЕрдЧрд░ рдореБрдЭреЗ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рдХреБрдЫ рд╕рдордп рдорд┐рд▓рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╢реЙрдЯ рджреВрдБрдЧрд╛ред рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдардВрдбрд╛ рд╣реЛ рдЬрд╛рдП: рдореБрд╕реНрдХрд╛рди:

рдкреАрдЖрд░ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рдЬреЛ рдЕрднреА рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдо рд╡рд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред

рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП --forceExit рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ЁЯОЙ

рдЧреЛрдЧрд▓рд░реНрд╕ рдХреЗ рд▓рд┐рдП: рдЬреЗрд╕реНрдЯ рдЬреЗрдирдХрд┐рдВрд╕ рд╕реАрдЖрдИ рдкрд░ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИ .. --forceExit рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рддрдп рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ .then ((= => {}) рдХреЗ рд╕рд╛рде рд╡рд╛рджрд╛ рдирд┐рднрд╛рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдерд╛ - рдХрд╛рдо рдХрд┐рдпрд╛

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

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ Firebase рдореБрджреНрджрд╛ рдмрди рдЧрдпрд╛ред рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП

afterAll(() => {
  firebaseApp.database().goOffline();
  firebaseApp.delete();
});

рдЪрд╛рд▓рдмрд╛рдЬреА рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рд▓рд╛рдЗрдиреЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдЙрд╕реА firebaseApp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ .initializeApp() ред

рдХреНрдпрд╛ рдмрд▓ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИред

рдЬреЗрд╕реНрдЯ 23 рдореЗрдВ --detectOpenHandles рдПрдХ рдзреНрд╡рдЬ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬреЗрд╕реНрдЯ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рдХреНрдпреЛрдВ рд╣реИ

--detectOpenHandles mongoose.connect рдФрд░ mongoose.model рджреЗрддрд╛ рд╣реИред рд╕рднреА рдореЗрдВ mongoose.disconnect рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ mongo рддреНрд░реБрдЯрд┐ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдЯреЛрдкреЛрд▓реЙрдЬреА рдирд╖реНрдЯ рд╣реЛ рдЧрдИред

screenshot 2018-06-08 11 14 51
screenshot 2018-06-08 11 14 29

@elkhan рдиреЗ рдпрд╣ рдкрддрд╛ рдореИрдВрдЧреЛрдЬрд╝ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП?

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

рдореЗрд░реЗ рд▓рд┐рдП, --forceExit рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реА рд╕рдордп рдореИрдВ --detectOpenHandles рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдФрд░ рд╕рд░реНрдХрд┐рд▓ (рджреЛрдиреЛрдВ рдореЗрдВ) рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред рдореИрдВ --runInBand рд╕рд╛рде рднреА рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВред

рдореЗрд░реЗ рд▓рд┐рдП, --runInBand рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рд╕реЗ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реБрдЖред

--forceExit shippable рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореЗрд░реЗ рд▓рд┐рдП рднреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддреА рд╣реИ ... --detectOpenHandles рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджрд┐рдпрд╛ рдФрд░ рдЕрднреА рднреА рдирд┐рд░реНрдорд╛рдг рдХреЗ рдХрд╛рд░рдг рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИ

--detectOpenHandles рдЬреЛрдбрд╝рдирд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╡рд┐рдЪрд┐рддреНрд░ рд╣реИред

рдиреЛрдб: v8.12.0
рдЬреЗрд╕реНрдЯ: v23.6.0

--detectOpenHandles рдпрд╛ --forceExit рдЬреЛрдбрд╝рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдХреЛрдбрд╢рд┐рдк рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВред

jest --ci --verbose --forceExit --detectOpenHandle

рдиреЛрдб: v8.12.0
рдЬреЗрд╕реНрдЯ: v23.6.0

@sibelius рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдореЙрдбрд▓ рдХреЗ init рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдореНрдпреВрдЯ рдХрд░рдХреЗ рд╣реИ

const mongoose = require('mongoose');

mongoose.Model.init = () => {};

рдпрд╣ рдЬреЗрд╕реНрдЯ рдХреЛ рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рджреЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрдВрдбреЗрдХреНрд╕ рдирд╣реАрдВ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ

db.collection("test-collection").add({
    title: 'post title',
    content: 'This is the test post content.',
    date: new Date(),
})
    .then(docRef => {
        console.log('Document written with ID: ', docRef);
    })
    .catch(error => {
        console.error('Error adding document: ', error);
    });

jest --forceExit --detectOpenHandle рдкрд░реАрдХреНрд╖рдг рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди .then рдпрд╛ .catch рдореЗрдВ рдХреЛрдб рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ !!
рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

@alexpchin рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛:

    beforeAll(async (done) => {
        dbConnection = await mongoose.connect(...)
        done()
    })

    afterAll(async (done) => {
        await dbConnection.close()
        dbConnection.on('disconnected', done)
    })

NestJs рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдЬреЛрдбрд╝рдирд╛ рдерд╛

afterAll(() => {
  app.close();
});

рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рд╕реНрдореГрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓ рд░рд╣реА jest рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрд╛рд░рдг рдерд╛ред --maxWorkers=10 рдЬреЛрдбрд╝рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

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

  'testURL': 'http://localhost/',

рдЬрд┐рд╕рдиреЗ JSDom рдХреЛ рд▓реЛрдб рдХрд┐рдпрд╛ рдФрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЗрдирд╛рдпрдд рд╕реЗ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдЬреЗрд╕реНрдЯ рдХреЛ рдЬреАрд╡рд┐рдд рд░рдЦрд╛ред

рдореИрдВрдиреЗ рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬреЗрд╕реНрдЯ рддрдм рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЗрд╕реЗ рджреЗрдЦреЗрдВ :

SecurityError: localStorage is not available for opaque origins

рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ jest.config.js рдЬреЛрдбрд╝рд╛:

  'testEnvironment': 'node',

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдорджрдж рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдХрд╛рд░рдг рдХреЛ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдБ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдерд╛ред
рдореИрдВ рдЯреНрд░реЗрд╡рд┐рд╕ рдХреЗ рднреАрддрд░ рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ NodeJS рдРрдк рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЯреНрд░реИрд╡рд┐рд╕ рдЬреЗрд╕реНрдЯ рдХреЗ рдмрд╛рдж рд╕реАрдзреЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рддрдХ рд▓рдЯрдХрд╛ рд░рд╣рд╛ред рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрд╕реНрдЯ рдмрдВрдж рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рдерд╛ред
рдХрдИ рдХреЛрд╢рд┐рд╢реЛрдВ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЬреЗрдПрд╕рд╕реАрдУрдПрдо рдХреЗ рд╕рд╛рде рдЬреЗрд╕реНрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдореЗрд░реА jest.config.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдереА:

  'testURL': 'http://localhost/',

рдЬрд┐рд╕рд╕реЗ JSDom рд▓реЛрдб рд╣реЛ рдЧрдпрд╛ рдФрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЗрдирд╛рдпрдд рд╕реЗ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЬреЗрд╕реНрдЯ рдХреЛ рдЬреАрд╡рд┐рдд рд░рдЦрд╛ред

рдореИрдВрдиреЗ рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬреЗрд╕реНрдЯ рддрдм рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЗрд╕реЗ рджреЗрдЦреЗрдВ :

SecurityError: localStorage is not available for opaque origins

рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ jest.config.js рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝рд╛:

  'testEnvironment': 'node',

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред

--forceExit --detectOpenHandles --maxWorkers = 10

рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд┐рдпрд╛

рдиреЛрдб: 8.11.3
рдЬреЗрд╕реНрдЯ 23.6.0

NestJs рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдЬреЛрдбрд╝рдирд╛ рдерд╛

afterAll(() => {
  app.close();
});

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

afterAll(async () => {
        await app.close()
    })

рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ --forceExit --maxWorkers=10 рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдореИрдВ Ubuntu 18.04 рдкрд░ рд╣реВрдВ, [email protected] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, NodeJS 10 рдпрд╛ 11 рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА Node 6 ou Node 8. рдХреЗ тАЛтАЛрд╕рд╛рде рд╣реИред --detectOpenHandles рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ --forceExit рд╕рдорд╕реНрдпрд╛ рдХреЛ рднреА рдареАрдХ рдХрд░рддреЗ рд╣реИрдВред

+1 рдЕрдзрд┐рдХ рд╡реНрдпрдХреНрддрд┐ рдпрд╣рд╛рдВ (рдЬреИрд╕реЗ @motss рдФрд░ @seanlindo ) рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ _ "рдЯреЗрд╕реНрдЯ рд░рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЬреЗрд╕реНрдЯ рдПрдХ рд╕реЗрдХрдВрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд╣реБрдЖред" _ рдХреЗрд╡рд▓ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм --detectOpenHandles рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

[email protected]

--detectOpenHandles рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдг рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди --detectOpenHandles рд╕рд╛рде рдЪрд▓рдиреЗ рдкрд░ рдХреЛрдИ рдЦреБрд▓рд╛ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред

рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реА рдорд╢реАрди / рдХрдВрдЯреЗрдирд░ рдореЗрдВ рджреЛ рдХреЛрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкрд░реАрдХреНрд╖рдг maxWorkers=1 рд╕рд╛рде рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ

рдЬрдм рдореИрдВ --detectOpenHandles рдзреНрд╡рдЬ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдФрд░ --debug рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ config / GlobalConfig рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ, рддреЛ detectOpenHandles рдореВрд▓реНрдп _only_ рдЕрдВрддрд░ рд╣реИ ...

рдЕрдЧрд░ рдореИрдВ with --runInBand --detectOpenHandles рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдКрдВ рддреЛ рднреА рдареАрдХ рдЧреБрдЬрд░рддрд╛ рд╣реИред

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

  • jest --maxWorkers=2
  • jest --detectOpenHandles
  • jest --forceExit

рдЗрд╕рдХреЗ рд▓рд┐рдП maxWorkers=2 рдХреЗ рд╕рд╛рде рдЕрднреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдореЗрд░реЗ рдЕрд╡рд▓реЛрдХрди рд╣реИрдВ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рдХреЛ рднреА рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП ...

_Edit: рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╡рд░рдг: рдпрд╣ рдХреЗрд╡рд▓ рдореЗрд░реЗ CI рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рдбреЙрдХ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдЕрд▓реНрдкрд╛рдЗрди: 3.7 рд░рдирд┐рдВрдЧ рдиреЛрдб v9.9.3 рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рджреЗрд╡ рдорд╢реАрди рдкрд░ --maxWorkers=1 рд╕рд╛рде рдкреБрди: рдкреЗрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

рдЕрднреА рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реВрдВред --maxWorkers=10 рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП .... рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рд╕рдордп рд╕реЗ рд▓рдбрд╝ рд░рд╣рд╛ рдерд╛ (рдЯреНрд░реИрд╡рд┐рд╕ рд╕реА, рдХрд╡рд░реЙрд▓ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред
рдпрд╣ рдПрдХ рдЕрд╕рдлрд▓ рдирд┐рд░реНрдорд╛рдг (рдФрд░ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ рдореЗрдВ рдХреЗрд╡рд▓ w / рд▓реЗрдХрд┐рди) рдХреЛ рд▓рдЯрдХрд╛ рджреЗрдЧрд╛ рдФрд░ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред

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

рдпрд╣ npm рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рд╛

   "test": "jest",
    "test:coverage": "npm run test -- --collectCoverage && cat ./src/coverage/lcov.info | coveralls",

рдФрд░ (рдЯреНрд░реИрд╡рд┐рд╕ рд╕реА рдореЗрдВ) рдЙрддреНрддреАрд░реНрдг рдХрд┐рдпрд╛:

   "test": "jest .*\.test\.ts",
    "test:coverage": "npm run test -- --collectCoverage && cat ./src/coverage/lcov.info | coveralls",

рдпрджрд┐ рдЖрдк Redhat UBI рдЫрд╡рд┐ рдФрд░ create-react-app рд╕рд╛рде docker рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ CI=true рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ npm test

рджрд┐рд╕рдВрдмрд░ 2019. рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЗрд╡рд▓ рдЯреНрд░реИрд╡рд┐рд╕ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдЯреЗрд╕реНрдЯ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВред @qopqopqop рдХрд╛ рдлрд╝рд┐рдХреНрд╕ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред рдЬреЗрд╕реНрдЯ рд╕рдВрд╕реНрдХрд░рдг 24.9.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

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

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

@koooge рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж 0 рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ --watchAll = false рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
рдЬреИрд╕реЗ npm рд░рди рдЯреЗрд╕реНрдЯ - --watchAll = false

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛

рдлрд╛рдпрд░рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдпрд╣ рдХрд░рдирд╛ рдкрдбрд╝рд╛:

afterAll(() => {
    firebase.app().delete();
});

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

--forceExit

https://jestjs.io/docs/en/cli# --forceexit

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднреА рднрд╛рдЧ рдЧрдпрд╛ред рдпрд╣ A worker process has failed to exit gracefully and has been force exited... рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ рджреЗрдЦрдХрд░ рдХрд╖реНрдЯрдкреНрд░рдж рдерд╛ рдЬрдм рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рд╕рднреА async рдХреЙрд▓ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ --detectOpenHandles рд╕рд╛рде рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдП рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ рджрд┐рдЦрд╛ред рдХреБрдЫ рд╢реЛрдз рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореЗрд░рд╛ рдЕрдкрд░рд╛рдзреА Promise.race ред

рдореИрдВ рдПрдХ рдореВрд▓ рд╡рд╛рджрд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп (https://github.com/blend/promise-utils) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ timeout рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рдЕрдкрдиреЗ рдХреБрдЫ рдмрд╛рд╣рд░реА рдПрдкреАрдЖрдИ рдХреЙрд▓ рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВред рдпрд╣ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЗрди-рдЯрд░реНрди рджреЗрд╢реА Promise.race рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

рдореИрдВрдиреЗ рдЙрд╕ рдХреЛрдб рдХреЛ рдирд┐рдХрд╛рд▓рд╛ рдФрд░ рдЕрдкрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рдХреЗрд╕ рдмрдирд╛рдпрд╛ред

it('promise.race', async() => {
  await Promise.race([
    new Promise((res) => setTimeout(res, 10000)),
    Promise.resolve('true')
  ])
})

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

рдЬрд┐рд╕ рднреА рддрд░реАрдХреЗ рд╕реЗ jest рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реБрдб рдХреЗ рддрд╣рдд рдЦреБрд▓реЗ рд╣реИрдВрдбрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ Promise.race рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЫреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВрдбрд▓ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд▓реЗ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЭреВрдареА-рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╢реНрд░реЗрдгреА рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЧрд▓рдд-рд╕рдХрд╛рд░рд╛рддреНрдордХ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рджреЗрд╡рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИред

рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╣рд░ рдХрд┐рд╕реА рдХреА рддрд░рд╣ --forceExit рд╕рд╛рде рдЪрд┐рдкрдХрд╛ рд░рд╣рд╛ рд╣реВрдБред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдмрд╕ рдпрд╣ рдкрд╛рдпрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЧрд╣рд░рд╛ рдиреЛрдбреНрдЬ / v8 рдореБрджреНрджрд╛ рд╣реИ https://github.com/nodejs/node/issues/24321

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

afterAll(async () => {
  // Shut down Firestore, otherwise jest doesn't exit cleanly
  await firestoreInstance.terminate()
});

рдореБрдЭреЗ рдЕрднреА рднреА рдЕрдкреЛрд▓реЛ рдФрд░ рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рднрд▓реЗ рд╣реА рд╡рд┐рдХрд▓реНрдк --detectOpenHandles рдЕрдВрддрддрдГ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреБрдЫ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП (рдФрд░ рдЗрд╕рдХреЗ рдирд╛рдо рдХреЗ рд╡рд┐рдкрд░реАрдд): рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рд╣реИрдВрдбрд▓ рдЕрднреА рднреА рдЦреБрд▓реЗ рд╣реИрдВ!) рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

--forceExit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ:

Jest рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рдмрд▓: рдХреНрдпрд╛ рдЖрдкрдиреЗ async рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП --detectOpenHandles рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ?

рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдореИрдВрдиреЗ рдкрд╛рдпрд╛ (рдФрд░ рдпрд╣ рдХреЛрдИ рдЙрдкрд╛рдп рдирд╣реАрдВ рд╣реИ!) рдПрдХ teardown рдХреЛ jest.config.js рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ:

globalTeardown: '<rootDir>/__tests__/teardown.js',

рдФрд░ рдЖрдВрд╕реВ рдореЗрдВред js рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

module.exports = async function () {
    console.log('done!');
    process.exit(0);
}

рдореБрдЭреЗ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореИрдВрдиреЗ forceExit: true рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред --forceExit --detectOpenHandles --maxWorkers=10 рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

https://github.com/atom-ide-community/atom-ide-base/pull/33

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрджреНрджрд╛ рдХрд╣реАрдВ рдФрд░ред рдпрд╣ рдкрд░реАрдХреНрд╖рдг-рдзрд╛рд╡рдХ рдореЗрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ...

@alusicode
рдпрд╣ рдПрдХ рдореЗрд░реЗ рд▓рд┐рдП npm test --watchAll=false рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛
рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ package.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ --watchAll=false рдЬреЛрдбрд╝рдХрд░ рдХрд╛рдо рдХрд┐рдпрд╛ред ЁЯСН

рдкрд╕рдВрдж

"test": "react-scripts test a jest --ci --reporters=default --reporters=jest-junit --watchAll=false"

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдбреЙрдХреНрд╕: https://jestjs.io/docs/en/cli.html# --watchall

рдлрд╛рдпрд░рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рднреА рдпрд╣реА рдореБрджреНрджрд╛ рдерд╛ред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ jest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХрд╣рд╛ рдХрд┐ рдореЗрд░реА рдХреБрдЫ рд▓рд┐рдкрд┐рдпреЛрдВ рдиреЗ рд╢рд╛рд▓реАрдирддрд╛рдкреВрд░реНрд╡рдХ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ --runInBand --detectOpenHandles рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдореЗрд░реЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░реЗрдЧрд╛ (btw --detectOpenHandles рдиреЗ рдореБрдЭреЗ рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдореБрджреНрджреЗ рдереЗ)ред
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЬрд╛рдБрдЪ рд╢реБрд░реВ рдХрд░ рджреАред рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ 2 рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдм рдореИрдВ рдПрдХ async рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рдерд╛ рддреЛ рдореИрдВ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ред
рдкреНрд░рддреАрдХреНрд╖рд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рд╕рд╛рдорд╛рдиреНрдп --detectOpenHandles рдореБрджреНрджреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

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

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

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

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

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

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

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