Sinon: `GetStackFrames () [0]` рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдЬреВрди 2016  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: sinonjs/sinon

рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдЖрдк рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдордЭрдиреЗ, рдЙрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рд╢реАрдШреНрд░рддрд╛ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛред

  • рд╕рд┐рдиреЙрди рд╕рдВрд╕реНрдХрд░рдг: 1.17.4
  • рдкрд░реНрдпрд╛рд╡рд░рдг: рдлрд╛рдпрд░рдлреЙрдХреНрд╕
  • рдЙрджрд╛рд╣рд░рдг рдпреВрдЖрд░рдПрд▓:
  • рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬрд┐рдирдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдореЛрдЪрд╛, рдЪрд╛рдп

рдЖрдкрдиреЗ рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рдереА?

рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА рдХрд┐ рдореЗрд░реА рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рдХреА рд╕реВрдЪрдирд╛ рджреА рдЬрд╛рдПрдЧреА, рдЖрдВрддрд░рд┐рдХ рд╕рд┐рдиреЙрди рддреНрд░реБрдЯрд┐ рдХреА рдирд╣реАрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ

рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕рд┐рдиреЙрди рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рдЧрдИ рд╣реИред

рдХреИрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░реЗрдВ

_рдХреЛрдб рдХреЗ рд╕рд╛рде_ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ рдХрд┐ рджреЛрд╖рдкреВрд░реНрдг рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреИрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдП,
рдпрд╛ JSBin рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХреЛрдб рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ

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

рдореЗрдВ sinon/lib/sinon/call.js , рдпрд╣ рдХреЛрдб рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ this.getStackFrames(...)[0] is undefined :

      if (this.stack) {
            callStr += this.getStackFrames()[0].replace(/^\s*(?:at\s+|@)?/, " at ");
      }

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗ:

    getStackFrames: function () {
        // Omit the error message and the two top stack frames in sinon itself:
        return this.stack && this.stack.split("\n").slice(3);
    },

...рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ slice рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдирдореВрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

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

рдпрд╣ рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдиреЛрдб рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

let sinon = require('sinon');

function test() {

  let stub1 = sinon.stub().returns( Promise.resolve({}) );
  let stub2 = sinon.stub();

  function run() {
    return stub1().then( stub2 );
  }

  run()
  .then( () => sinon.assert.calledTwice( stub2 ) )
  .catch( console.log );

}

setTimeout( test, 0 );

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

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

рдореИрдВ рдЗрд╕реЗ рд╕рд┐рдиреЙрди 1.17.6 (рдирд╡реАрдирддрдо http://sinonjs.org/ рдкрд░ рдЙрдкрд▓рдмреНрдз) рдХреЗ рд╕рд╛рде рдореИрдХ рдХреЗ рд▓рд┐рдП рдХреНрд░реЛрдо 55.0.2883.95 рдореЗрдВ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред

рдпрд╣рд╛рдБ рдПрдХ рдХрдо рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рдПрдХ JSBin рд╣реИ: http://jsbin.com/mufotihiwo/edit?js ,console,output

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдПрдХ рд╕реНрдЯрдм рдХреЛ Promise#then() рдкреЙрдЗрдВрдЯ-рдлреНрд░реА рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд┐рдиреЙрди _рдерд┐рдВрдХреНрд╕_ рдореЗрдВ 3 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЕрднреА рддрдХ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдореМрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓рдмреИрдХ рд╕реАрдзреЗ рд╡реАрдПрдо рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдвреЗрд░ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рддреЛ рдЬрдм рд╕рд┐рдиреЙрди рдкрд╣рд▓реА 3 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИ ( spy.invoke() ), рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИред рдлрд┐рд░ String#replace() рдореЗрдВ call.toString рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ getStackFrames()[0] undefined ред

рдореИрдВ _рдерд┐рдВрдХ_ рдПрдХ рд╢рдорди рд░рдгрдиреАрддрд┐ рдХреЗрд╡рд▓ toString() рдореЗрдВ рдПрдХ рд░рдХреНрд╖рд╛рддреНрдордХ рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

callStr += ( this.getStackFrames()[0] || 'unknown function' ).replace(/^\s*(?:at\s+|@)?/, " at ");

рдпрд╣ рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдиреЛрдб рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

let sinon = require('sinon');

function test() {

  let stub1 = sinon.stub().returns( Promise.resolve({}) );
  let stub2 = sinon.stub();

  function run() {
    return stub1().then( stub2 );
  }

  run()
  .then( () => sinon.assert.calledTwice( stub2 ) )
  .catch( console.log );

}

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

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

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

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

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

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

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