Sinon: рдХреЙрд▓ рдХреЛ .callsFake рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдирдпрд╛ рд╕реНрдЯрдм рдПрдкреАрдЖрдИ рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рдорд╛рд░реНрдЪ 2017  ┬╖  23рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: sinonjs/sinon

  • рд╕рд┐рдиреЙрди рд╕рдВрд╕реНрдХрд░рдг: 2.0.0
  • рдкрд░реНрдпрд╛рд╡рд░рдг : рдиреЛрдб 7.7.3
  • рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬрд┐рдирдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: sinon-test , sinon-chai , chai ред

рдЖрдкрдиреЗ рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рдереА?
sinon.stub рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ 1.x рд╕реЗ 2.0.0 рдпрд╛ рддреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдирд╛ рдпрд╛ sinon-codemod рдХрд░рдирд╛ рдкрд░реАрдХреНрд╖рдг рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

 at Object.proxy [as prefetch] (node_modules/sinon/lib/sinon/spy.js:97:22)
      at Object.invoke (node_modules/sinon/lib/sinon/behavior.js:130:32)
      at Object.functionStub (node_modules/sinon/lib/sinon/stub.js:83:53)
      at Function.invoke (node_modules/sinon/lib/sinon/spy.js:190:51)
      at Object.proxy [as prefetch] (node_modules/sinon/lib/sinon/spy.js:97:22)
      at Object.invoke (node_modules/sinon/lib/sinon/behavior.js:130:32)
      at Object.functionStub (node_modules/sinon/lib/sinon/stub.js:83:53)
      at Function.invoke (node_modules/sinon/lib/sinon/spy.js:190:51)
      at Object.proxy [as prefetch] (node_modules/sinon/lib/sinon/spy.js:97:22)
      at Object.invoke (node_modules/sinon/lib/sinon/behavior.js:130:32)
      // ....

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

sinon.stub(obj, 'meth', fn) is deprecated and will be removed fromthe public API in a future version of sinon.
 Use stub(obj, 'meth').callsFake(fn).
 Codemod available at https://github.com/hurrymaplelad/sinon-codemod

рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдЯ рдкрд░, рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдкреЛ рд╣реИ: "fromthe public" -> "from the public"

рд╕рд╛рде рд╣реА, рдЗрд╕ рддрд░рд╣ рдХреА рдХреЙрд▓ рдПрдХ рд╣реА рдЪреЗрддрд╛рд╡рдиреА рджрд┐рдЦрд╛рдПрдЧреА - рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╕рдЪ рдореЗрдВ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдирдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреНрдпрд╛ рд╣реИ:

this.stub(seneca, 'export')
        .withArgs('transport/utils').returns(transportUtils);

рдХреИрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░реЗрдВ
рдореЗрд░реЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЙрд▓реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рдерд╛:

sinon.stub(channel, 'assertQueue', channel.assertQueue);

рдирдП 2.0.0 рд╕реНрдЯрдм рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде:

sinon.stub(channel, 'assertQueue').callsFake(channel.assertQueue);

рдЖрдк seneca-amqp-transport рд░реЗрдкреЛ рд╕реЗ рдкреВрд░реЗ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЛ рднреА рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

git clone -b enhancement/sinon-2.0.0 --single-branch [email protected]:senecajs/seneca-amqp-transport.git
cd seneca-amqp-transport && npm i
npm run validate

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

рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд▓рдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП .callsFake рд╕рд╛рде рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╕рднреА reset() рдХреЙрд▓ рдХреЛ resetHistory() рд╕реЗ рдмрджрд▓рдиреЗ рдкрд░ , рдЬреИрд╕рд╛ рдХрд┐

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

рдПрдХ рдЕрдЪреНрдЫрд╛ рдореБрджреНрджрд╛ рдФрд░ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдЗрд╕реЗ рджреЗрдЦреВрдВрдЧрд╛, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ/рдЬреЛрдбрд╝рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

@ fatso83 рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рдЪрд╛рд╣рд┐рдП рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

@ fatso83 рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬрд╛рд░реА 2.1.0 рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╡рд╣реА рд╣реЛрддрд╛ рд╣реИред рдкрддрд╛ рдирд╣реАрдВ рдЕрдЧрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рдкрдЯрд╛ рдЧрдпрд╛ рдерд╛ (рд╢рд╛рдпрдж рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЕрднреА рднреА рдЦреБрд▓рд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╕реЛрдЪрд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдПрдХ рдЪреАрдЬ рдЬреЛ _could_ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╡рд╣ рд╣реИ sinon-chai рдЬрд┐рд╕рдореЗрдВ sinon < 2 рдкрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рд╣рдХрд░реНрдореА рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреБрд░рд╛рдиреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

рд╣рд╛рдп @nfantone , рдЪреВрдВрдХрд┐ рдореИрдВ рдЪрд╛рдИ рдХреЛрдбрдмреЗрд╕ рдФрд░ рдЗрд╕рдХреЗ рдХреБрдЫ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рд╕рд┐рдиреЙрди-рдЪрд╛рдИ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

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

рдореИрдВ рдЕрдкрдиреЗ рдареВрдВрда рдХреЛ рдЬрд╛рд╕реВрд╕реЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рдЙрдВрдЧрд╛? рдХреНрдпрд╛ рдЬрд╛рд╕реВрд╕ рднреА рдлрд░реНрдЬреА рддрд░реАрдХреЗ рдХреЛ рдмреБрд▓рд╛рдПрдВрдЧреЗ? рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдореВрд▓ рдорд╛рдорд▓реЗ рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ:

sinon.stub(channel, 'assertQueue', channel.assertQueue);

рдЬрд╛рд╕реВрд╕реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рд╕реНрдЯрдм рдХреЛ рдореВрд▓ channel.assertQueue рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЬрд╛рд╕реВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдХреЙрд▓, рддрд░реНрдХ рдФрд░ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдЕрднреА рднреА рдкреБрд░рд╛рдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмреБрд▓рд╛рдУред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

sinon.stub(channel, 'assertQueue', channel.assertQueue);

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

sinon.spy(channel, 'assertQueue');

рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдХреЙрд▓ рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ spies , рдпрджрд┐ рдЖрдкрдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ stubs ред

@lucasfcosta рдареАрдХ рд╣реИ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЖрдк рд╕рд╣реА рдереЗред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ .spy рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ _call_ рд╡рд╣ рдореВрд▓ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕ рдкрд░ рдЖрдк рдЬрд╛рд╕реВрд╕реА рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ .stub рдХреЙрд▓реЛрдВ рдХреЛ .spy рдФрд░ рдЕрдм рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред

рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрджреНрдпрддрди рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╣ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреИрд╕реЗ:

  this.stub(seneca, 'export').withArgs('transport/utils').returns(transportUtils);

рдЗрд╕реЗ рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ callsFake рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдЕрд╕рдлрд▓ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕реНрдЯрдмреНрдб рдлрд╝рдВрдХреНрд╢рди рдмрд╕ undefined рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ fake рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЬрд╛рд╕реВрд╕ рдореЗрдВ this.fakes рдЕрднреА рднреА рдЦрд╛рд▓реА рд╣реИред

рдореВрд▓ 3-рдЖрд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдп @emirotin , рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдПрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕реЗ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рди рд╕рдордп рдерд╛, рдЬрд┐рд╕рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдмрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред

@nfantone рдЖрдкрдХреЛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдЕрдВрддрд┐рдо рджрд┐рдиреЛрдВ рдореЗрдВ рдмрд╣реБрдд рд╡реНрдпрд╕реНрдд рд░рд╣рд╛ рд╣реВрдВред
рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдФрд░ рдЯреИрдЧ рдХрд┐рдП рдЧрдП v2.0.0 рдкреНрд░рддрд┐рдмрджреНрдз рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдИ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рдорд┐рд▓реА:

var stub = sinon.stub;
var obj = {
  bla: function () { return 'foo' }
}

stub(obj, 'bla').withArgs('lol').returns('bar');

assert(obj.bla('lol'), 'bar')

рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЦреЛрдж рд╕рдХреВрдВ?

рд╣реБрд╣ рдореИрдВ рд╕рд░рд▓реАрдХреГрдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреБрди: рдкреЗрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЬреАрдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рджреЗрдВ

рдЖрд╣, рдпрд╣рд╛рдБ рд╣реИ!

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ reset рдирдХрд▓реА рдорд┐рдЯрд╛ рд░рд╣рд╛ рд╣реИ:

var sinon = require('sinon')

var x = {
    a: function() {
        return 'Fail'
    }
}

var sandbox = sinon.sandbox.create();

sandbox.stub(x, 'a').callsFake(function() {
    return 'OK'
})

console.log(x.a())

sandbox.reset();

console.log(x.a()) // <-- undefined

рдзрдиреНрдпрд╡рд╛рдж @ рдПрдорд┐рд░реЛрдЯрд┐рди!

рддреЛ, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рд╣реИ рдирд╛?

рдЖрдЗрдП @nfantone рдХреЗ рдЙрддреНрддрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдЙрдореНрдореАрдж рд╕реЗ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рд╕рдХреЗрдВред

рд╕рд╛рде рд╣реА, рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИрдВ:

screen shot 2017-04-24 at 18 48 24

рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдореИрдВ docs/_releases рдФрд░ docs/release-source рджреЛрдиреЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореЗрд░реЗ рд╕реНрдерд╛рдиреАрдп рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

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

callsFake рд╕реЗ рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реЗрдЯрдЕрдк рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рд░реАрд╕реЗрдЯ рдХреЗ рдмрд╛рдж рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ "рдореВрд▓ рд╕реЗрдЯрдЕрдк рдХреЗ рдмрд╛рдж рд╕рдм рдХреБрдЫ рдареАрдХ рджрд┐рдЦрдиреЗ" рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рд╣реИред

рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдкрд┐рдЫрд▓реЗ 3-рдЖрд░реНрдЧ рдлреЙрд░реНрдо рд╕реЗ рдЕрд▓рдЧ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХреЗ рд╕рдордХрдХреНрд╖ рдирдП рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЬреНрдЮрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдкреБрд░рд╛рдирд╛ рдПрдкреАрдЖрдИ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд░рдХреНрд╖рд┐рдд рд╣реИред

@emirotin рдореИрдВ рдирд╛рдо рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

рдореИрдВрдиреЗ рд╡рд╣реА рдмрд╛рдд #1371 рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░реАрд╕реЗрдЯ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рдирд╛рдо рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

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

рдЖрдЗрдП рдЕрдиреБрдЪрд░реЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред

@lucasfcosta рдпрд╣рд╛рдБ рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЦреЛрдж рд╕рдХреВрдВ?

рд╕реЗрдиреЗрдХрд╛-рдПрдПрдордХреНрдпреВрдкреА-рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред

рдмрд╕ рд░реЗрдкреЛ рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ, рдбрд┐рдкреНрд╕ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ, npm test рдЪрд▓рд╛рдПрдВред рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

    the handleMessage() function
      тЬУ should handle the request when a message is consumed
sinon.stub(obj, 'meth', fn) is deprecated and will be removed from the public API in a future version of sinon.
 Use stub(obj, 'meth').callsFake(fn).
 Codemod available at https://github.com/hurrymaplelad/sinon-codemod

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ:

    it('should handle the request when a message is consumed',
      sinon.test(function(done) {
        var handleRequest = this.spy(transportUtils, 'handle_request');

       // This is the sub throwing the warning
        this.stub(seneca, 'export')
            .withArgs('transport/utils').returns(transportUtils);

        var listener = Listener(seneca, options);
        listener.listen()
          .then(() => {
            handleRequest.should.have.been.calledOnce();
            handleRequest.should.have.been.calledWith(seneca, { foo: 'bar' },
              DEFAULT_OPTIONS, sinon.match.func);
          })
          .asCallback(done);
      }));

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

рдПрдХ рддрд░рдл рдзреНрдпрд╛рди рджреЗрдВ, рдореИрдВ .reset рдФрд░ .callsFake рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ @emirotin рднрд╛рд╡рдирд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдпрджрд┐ рдирдпрд╛ рдПрдкреАрдЖрдИ "рд╕рдВрдЧрдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди" рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЕрд░реНрдерд╛рддред

рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд▓рдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП .callsFake рд╕рд╛рде рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╕рднреА reset() рдХреЙрд▓ рдХреЛ resetHistory() рд╕реЗ рдмрджрд▓рдиреЗ рдкрд░ , рдЬреИрд╕рд╛ рдХрд┐

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

Promise.then callsFake рдкрджреНрдзрддрд┐ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ?

// first way
// if no await will not arrived
await store.dispatch(deleteById(id)).then(()=>{
     // can arrived here
 })
// second way
sinon.stub(wrapper.find(Account).instance(), "_deleteById").callsFake(async (id)=>{
     // truly http request by axios
     await store.dispatch(deleteById(id)).then(()=>{
          // can't arrived here
      })
});

рдПрд╕реАрдЯреЛрди рдореЗрдВ

export function deleteById(id){
    return dispatch=>{
        return axios.put(url,data).then(()=>{
              // can't arrived here second way but first arrived
        })
    }
}

@mqliutie рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдореИрдХреЛрдЬрд╝ рдкрд░ рдирд╡реАрдирддрдо рдХреНрд░реЛрдо рдореЗрдВ, рд╕рд╛рдЗрдкреНрд░рд╕ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рд╕реНрдЯрдмрд┐рдВрдЧ (https://github.com/cypress-io/cypress-documentation/issues/122) рдореЗрдВ рдЗрд╕рдореЗрдВ рдЯрдХреНрдХрд░ рд▓рдЧреА рд╣реИред

@MichaelHindley рдХреЙрд▓ done() рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ done() рдореЗрд░реЗ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдирдХрд▓реА рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП window.fetch рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрдмрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдЕрдкреЛрд▓реЛ рдХреЗ рд▓рд┐рдП "рддрддреНрдХрд╛рд▓" рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрдирдкреБрдЯ!

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЧрд▓рддреА рд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рджрд┐рдпрд╛ред рдмрдВрдж рдХрд░рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛

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

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

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

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

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

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

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