Cucumber-js: рдлрд╝реАрдЪрд░ рдЕрдиреБрд░реЛрдз: рдпреВрдЖрдИ рдЬреЛ `рдЗрд╕` рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 31 рдЬрдире░ 2017  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: cucumber/cucumber-js

рдРрд╕реА рджреБрдирд┐рдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП:

require('cucumber').defineSupportCode( ({setWorldConstructor:world}) => {
    world(class { 
      constructor(p) { ... }
      foo(bar) { return new Promise(.... ) }
    })
})

рдореИрдВ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ:

  When(/^I do the foo with (.*)$/i, (ctx, bar) => ctx.foo(bar) );

рдХреА рдмрдЬрд╛рдп

  When(/^I do the foo with (.*)$/i, function(bar) {
      return this.foo(bar)
  });

рдпрд╣ рдореБрдЭреЗ рд╕рднреА async рд╕рдВрдЪрд╛рд▓рди рдкрд░ .bind(this) рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рднреА рдЫреБрдЯрдХрд╛рд░рд╛ рджрд┐рд▓рд╛рдПрдЧрд╛, рдпрд╛ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ - var that = this рд╕рд╛рде рдмрдВрджрд░реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред

рдПрдХ рдФрд░ рд▓рд╛рдн (рдЖрдИрдПрдордПрдЪрдУ) - рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдкреЗрдбрд╝ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬреЗрдПрд╕ рдХреА рдмреЗрд╣рддрд░ рд╢рдХреНрддрд┐рдпреЛрдВ рдХреА рдУрд░ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдЙрдиреНрдореБрдЦ рдХрд░реЗрдЧрд╛ред

accepted enhancement

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

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

defineSupportCode(({setWorldInjectionStrategy}) => {
  setWorldInjectionStrategy('this') // default
  setWorldInjectionStrategy('argument') // makes world be the first argument to steps and hooks 
})

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

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ world рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдПрдХ рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЛрдЪрд╛ рдХреА рддрд░рд╣ --ui exports рдФрд░ --ui tdd рдФрд░ --ui bdd - рдХреНрдпреВрдХреНрдпреВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡реЗрд░рд┐рдПрдмрд▓ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рджреБрдирд┐рдпрд╛ рдкрд░ рдХрджрдореЛрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛/рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ред рд╣рд╛рдБ рдпрд╣ рдЙрди 1 рдкрдВрдХреНрддрд┐ рдЪрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ => рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЛ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк рдЕрдиреНрдпрдерд╛ рдЕрд╕рдорд░реНрде рд╣реЛрддреЗ рд╣реИрдВред рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрд╣реБрдд рдХрдо рдХрджрдо рдЙрдард╛рдП рд╣реИрдВред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ ES6 рдореЗрдВ рдПрдХ рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЛ рдмрд░рдХрд░рд╛рд░ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛ред

рдпрд╣ рдореБрдЭреЗ рд╕рднреА async рд╕рдВрдЪрд╛рд▓рди рдкрд░ .bind(this) рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рднреА рдЫреБрдЯрдХрд╛рд░рд╛ рджрд┐рд▓рд╛рдПрдЧрд╛, рдпрд╛ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ - var that = this рд╕рд╛рде рдмрдВрджрд░реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЕрдВрджрд░ рд╡рд╕рд╛ рддреАрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ?

рдПрдХ рдФрд░ рд▓рд╛рдн (рдЖрдИрдПрдордПрдЪрдУ) - рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдкреЗрдбрд╝ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬреЗрдПрд╕ рдХреА рдмреЗрд╣рддрд░ рд╢рдХреНрддрд┐рдпреЛрдВ рдХреА рдУрд░ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдЙрдиреНрдореБрдЦ рдХрд░реЗрдЧрд╛ред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ / рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ

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

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

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

рдЬрдм рд╣рдо рдЪрд░рдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ this рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдУрдУрдкреА рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рдмрдЬрд╛рдп рдПрдлрдкреА рдкреНрд░рддрд┐рдорд╛рди рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред

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

@charlierudolph рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЬреЗрдПрд╕ рдХреА рдмреЗрд╣рддрд░ рд╢рдХреНрддрд┐рдпрд╛рдВ" @osher рдХрд╛ рдЕрд░реНрде рд╣реИ рдПрдлрдкреА, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред

рдЖрдИрдПрдордПрдЪрдУ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХрджрдо рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рдмрдирд╛ рджреЗрдЧрд╛ред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛: const thisWorldNotThisStep = this

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд╕рднреА async рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП .bind(this) рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬрдм рддрдХ рдЖрдк рдЪрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рднреАрддрд░ рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддрдм рддрдХ const self = this рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╕рдорд╕реНрдпрд╛ (рдЬреЛ рдХреЛрдИ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ) рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЪрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрджрд░, this рджреБрдирд┐рдпрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдЪрд░рдг, рдЬреЛ рдкреНрд░рддрд┐-рд╕рд╣рдЬ рд╣реИред

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

defineSupportCode(({setWorldInjectionStrategy}) => {
  setWorldInjectionStrategy('this') // default
  setWorldInjectionStrategy('argument') // makes world be the first argument to steps and hooks 
})

рдореИрдВ рджреБрдирд┐рдпрд╛ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВ/рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрджрдо рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд╕рднреА JS рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ ES6 рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдордд рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ тЭдя╕П

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

@charlierudolph рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рд╕рдореБрджрд╛рдп рдХреЛ рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рджреЗрдЧрд╛ред рдХрдХрдбрд╝реА рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд╕рднреА рдкреНрд░рддрд┐рд╖реНрдард╛рдиреЛрдВ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЛ рдореЗрдВ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдПрдВрдЧреЗред рдлреИрдВрд╕реА рдирд╣реАрдВред

рдореИрдВ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, v2 рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рд╕рдордп рд╣реИред рд╡реЗрдЯрд┐рдВрдЧ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЗрдЬрд░ рдХреЛ рдмрдирд╛рдиреЗ/рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░реЗрдЧреАред

рд╣рдо Before рдФрд░ After рдХреЛ world рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ:

defineSupportCode(function({After, Before, Given}) {
  let world;

  // Asynchronous Callback
  Before(function (w, scenarioResult, callback) {
    world = w;
    callback();
  });
  After(function (world, scenarioResult, callback) {
    callback();
  });

  Given('I access the world', () => {
    assert(world); // Yay!
  });
});

рдЗрд╕ рддрд░рд╣ рдЖрдк world рдХреЛ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ a before рдЪрд░рдг рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

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

рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдСрдирд▓рд╛рдЗрди рдкрд╛рдП рдЧрдП рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдХреА рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдПрдХ рд╕рдореНрдореЛрд╣рдХ рддрд░реНрдХ рд╣реИред

рднрд▓реЗ рд╣реА --ui рдЭрдВрдбреЗ рд╣реЛрдВ, рдпрд╛ setWorldInjectionStrategy('argument') - рдпрд╣ рдПрдХ рдЧреЛрдЪрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рднреА рдСрдирд▓рд╛рдЗрди рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкрд░реЛрд╕рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдРрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣рдВрдЧрд╛рдореЗ, рдФрд░ рднреНрд░рдо рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ cuke рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рджреЗрддрд╛ рд╣реВрдВ, рдФрд░ ... рдЗрд╕рдХреЗ рд░рд┐рд▓реАрдЬ рд╣реЛрдиреЗ рддрдХ makedoing рдХрд░рддрд╛ рд╣реВрдВред

рдПрдХ рдХреИрдирд░реА рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдПрдХ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдЭрдВрдбрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдкреНрд░рдЪрд╛рд░ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬрд▓реНрдж рд╣реА рдХрд░реВрдВрдЧрд╛

рдореБрдЭреЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдПрдлрдкреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкрд░реНрджрд╛рдлрд╛рд╢ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? (async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╡рд╛рджрд╛-рдЕрдиреБрдХреВрд▓ рднреА рд╣реИ)

import {initialize, Given, Before} from 'cucumber/fn'

// specify a function that returns the initial context:
initialize(async () => ({ a: 42 }))

Before({ timeout: 10 }, async (ctx) => {
  await doStuff(ctx.a)
})

Given(/^a step passes with {number}$/, async (ctx, number) => {
  const newA = await computeStuff(ctx.a, number)
  // tell cucumber about the new context:
  return Object.assign({}, ctx, { a: newA })
})

рдореИрдВрдиреЗ рдХрдХрдбрд╝реА-рдПрдлрдкреА рдХреЛ рдПрдХ рд╕рд╛рде рд╣реИрдХ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЪрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╕реБрдзрд╛рд░ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдВ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдХрд╛рдо рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рджреЗрдВред рд╢рд╛рдпрдж рдПрдХ рджрд┐рди рд╣рдо рдЗрд╕реЗ Cucumber.js рдореЗрдВ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

@jbpros рдореИрдВ рдЕрднреА рддрдХ рдПрдХ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рддреАрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ (рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ) рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рд╛рде рдЬреЛ рдЗрд╕реЗ рдЕрдиреБрдкрдпреЛрдЧреА рдмрдирд╛рддрд╛ рд╣реИ:

// Don't rely on `this` in step definitions. It's 2021 for crying out loud.
const definitionFunctionWrapper = (fn) =>
    function(...args) {
        return fn(...args.slice(0, -1), this);
    }

рд╡рд╣ рдЪреЗрддрд╛рд╡рдиреА рд╣рд░ рдПрдХ рдЪрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЕрдм рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдХрд╛рд░рдг рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рдХрд░рддреА рд╣реИ:

    Error: function uses multiple asynchronous interfaces: callback and promise
       to use the callback interface: do not return a promise
       to use the promise interface: remove the last argument to the function

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

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

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

@andyearnshaw рдЖрдкрдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдЪрд┐рдВрддрд╛ рд╕реБрдирддрд╛ рд╣реВрдВ "рд╕рд┐рд░реНрдл рд╕реНрдЯреЗрдкрдбреАрдл рдореЗрдВ рддреАрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП"ред рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╣ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд╕реНрдЯреЗрдк рдбрд┐рдл рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкреИрдХ рдХрд┐рдпрд╛ рд╣реИред

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

рд╕рд╛рде рд╣реА, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХреБрдЫ рдЕрдиреНрдп (рдЫреЛрдЯреЗ) рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрдкрдХрд░рдг рдкреЗрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ: tap() рдФрд░ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╕рдВрджрд░реНрднред

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

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

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

@andyearnshaw рд╣рд╛ рдареАрдХ рд╣реИ, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдирд╣реАрдВ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреБрд▓рд╛ рд░рдЦрдирд╛ рд╢рд╛рдпрдж рдЪреАрдЬреЛрдВ рдХреЛ рдкрд╛рд░рджрд░реНрд╢реА рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

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

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

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

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

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

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

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