Cucumber-js: рддрд░реНрдХреЛрдВ рдХреЛ рд╢рд┐рдерд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдлрд╝рд░ре░ 2016  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: cucumber/cucumber-js

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

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

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

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

рдореИрдВрдиреЗ рд╡рд╣реА рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛, #445 рджреЗрдЦреЗрдВ :)

@ рд░рд┐рдпрд╛рди релрей , рд╣рд╛рдБ, рдореИрдВрдиреЗ рдЙрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░

рдЖрдк рдХрд┐рд╕ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдЬрд╝рд░реВрд░ред рдПрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдкрдиреА рдЪрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 'рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ ${admin} рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИ'ред

рдЕрдм, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ ${admin} рд╢рд╛рдпрдж рдПрдХ JSON рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдЪрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдкрд╛рд╕ рд╣реЛрдЧреАред рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдкрддреНрддрд┐ рд╕рдВрдХрд▓реНрдк рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

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

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

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

рдпрджрд┐ рд╣рдо рдЪрд░рдг рддрд░реНрдХ рдЯреНрд░реЕрдирдлреЙрд░реНрдо рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреА: https://github.com/cucumber/cucumber/wiki/Step-Argument-Transforms?

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

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

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

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

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЕрдм рдПрдХ рджреЛ рдмрд╛рд░ рднрд╛рдЧрд╛ред

рд╕рдмрд╕реЗ рдкреНрд░рдореБрдЦ рдкреНрд░рддреНрдпреЗрдХ Then рдЪрд░рдг рдкрд░ retry рд╕рд╣рд╛рдпрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИ:

cucumber.Then = function(match, callback) {
  const retryingCallback = (...args) => retry(async () => await callback(...args));
  cucumber.Then(match, retryingCallback);
};

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

рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ

function has 0 arguments, should have 1 (if synchronous or returning a promise) or 2 (if accepting a callback)

рдЕрдм рдореИрдВ рдЬрд┐рд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рд╣реИ рд╣реЗрд▓реНрдкрд░ рдХреЛ рд╣рд░ Then рдЪрд░рдг рдореЗрдВ рдХреЙрд▓ рдХрд░рдирд╛, рдЬреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

this.Then(/^I see that "([^"]*)" does not have a destination$/, async clientName => {
  return retry(async () => {
    const client = await homeView.clientByName(clientName);
    expect(client.destinationName).to.not.exist;
  });
});

рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рдПрдХ рдФрд░ рдЖрд╕рд╛рди рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдЪрд╛рд╣рд┐рдПред

function loggedIn(username, func) {
  return (...args) => {
    await accounts.login(username);
    return func(...args)
  };
}

this.Then(/^someone logged in as "([^"]*)" sees a destination named "([^"]*)"$/, loggedIn(assert.destinationExists));

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдЪрд╛рдПрдЧрд╛ред

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

рдкреАрдПрд╕ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рд╕рд╣рд╛рдпрдХ:

const patience = 250;
const interval = 5;

function delay(time) {
  return new Promise(function (fulfill) {
    setTimeout(fulfill, time);
  });
}

async function attempt(start, func) {
  const attemptDate = new Date();
  try {
    return await func();
  } catch (errr) {
    const timeElapsed = attemptDate.getTime() - start.getTime();
    if (timeElapsed < patience) {
      await delay(interval);
      return await attempt(start, func);
    } else {
      throw errr;
    }
  }
}

export async function retry(func) {
  const start = new Date();
  return await attempt(start, func);
}

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

рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:

function splat(func) {
  return (one, two, three, four, five, six, seven, eight, nine, ten) => {
    if (typeof ten !== 'undefined') {
      return func(one, two, three, four, five, six, seven, eight, nine, ten);
    } else if (typeof nine !== 'undefined') {
      return func(one, two, three, four, five, six, seven, eight, nine);
    } else if (typeof eight !== 'undefined') {
      return func(one, two, three, four, five, six, seven, eight);
    } else if (typeof seven !== 'undefined') {
      return func(one, two, three, four, five, six, seven);
    } else if (typeof six !== 'undefined') {
      return func(one, two, three, four, five, six);
    } else if (typeof five !== 'undefined') {
      return func(one, two, three, four, five);
    } else if (typeof four !== 'undefined') {
      return func(one, two, three, four);
    } else if (typeof three !== 'undefined') {
      return func(one, two, three);
    } else if (typeof two !== 'undefined') {
      return func(one, two);
    } else if (typeof one !== 'undefined') {
      return func(one);
    } else {
      return func();
    }
  };
}

cucumber.Then = function(match, callback) {
  const retryingCallback = splat((...args) => retry(async () => await callback(...args)));
  cucumber.Then(match, retryingCallback);
};

рд▓реЗрдХрд┐рди

function has 10 arguments, should have 1 (if synchronous or returning a promise) or 2 (if accepting a callback)

рдореБрдЭреЗ рдЙрджрд╛рд╕ рдкрд╛рдВрдбрд╛ рдмрдирд╛рдирд╛

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

рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдпреЗ рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐ рдЪрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

this.Then(/^someone logged in as "([^"]*)" sees a destination named "([^"]*)"$/, createProxy(loggedIn(assert.destinationExists), 2));

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

рддреНрд░реБрдЯрд┐ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред :рдорд╛рд╕реВрдо:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ proxyLength рдореЗрдВ рдЧреБрдЬрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдХреЗрд╡рд▓ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рд▓рдкреЗрдЯ рд░рд╣реЗ рд╣реИрдВ рдФрд░ function.length ред

рдмрдврд╝рд┐рдпрд╛ рд╕реБрдЭрд╛рд╡, рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдЬреИрд╕рд╛ рдХреБрдЫ рдорд┐рд▓рд╛:

cucumber.Then = function(match, callback) {
  cucumber.Then(match, retryProxy(callback));
};

function retryProxy(func) {
  const numberOfArgs = func.length;
  switch (numberOfArgs) {
    case 0: return () => retry(func);
    case 1: return (a) => retry(func, a);
    case 2: return (a, b) => retry(func, a, b);
    case 3: return (a, b, c) => retry(func, a, b, c);
    case 4: return (a, b, c, d) => retry(func, a, b, c, d);
    case 5: return (a, b, c, d, e) => retry(func, a, b, c, d, e);
  }
}

рджреЛ рдЪреАрдЬреЗрдВ рдЬреЛ рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ рд╡рд╣ рд╣реИ рд▓реЙрдЧрд┐рди рд╣реЗрд▓реНрдкрд░ рдХреЗрд╕ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрди рджреЛрдиреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЕрдм рдореИрдВ рдЕрдкрдиреА рдЪрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рд╕рдорд╛рдпреЛрдЬрди рдХрд┐рдП рдмрд┐рдирд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ!

@thomasvanlankveld рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рд▓рдВрдмрд╛рдИ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ: https://github.com/blakeembrey/arity

@ рд╕реБрд╢реАрд▓-рдЖрд░рдПрдХреНрд╕рдЖрд░ рдХреНрдпрд╛ рдЖрдк рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рд▓рдВрдмрд╛рдИ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд░реИрдкрд░ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

2.0.0-rc.1 рдЕрдм рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрдВрдХреНрд╢рди рд░реИрдкрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдореВрд▓ рдХрд╛рд░реНрдп рд▓рдВрдмрд╛рдИ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рднреА рд╣реИред

рдЗрд╕ рдереНрд░реЗрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдХреГрдкрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдмрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВред

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

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

jan-molak picture jan-molak  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

stefdelec picture stefdelec  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lamartire picture lamartire  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

edgarechm picture edgarechm  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ