рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдЖрдк рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдордЭрдиреЗ, рдЙрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рд╢реАрдШреНрд░рддрд╛ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛред
- рд╕рд┐рдиреЙрди рд╕рдВрд╕реНрдХрд░рдг: 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
рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдирдореВрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!
рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд╕рд┐рдиреЙрди рдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдИ рднреА рдХреЛрдб рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдЖрдк рд╕рд┐рд░реНрдл рд╕рд┐рдиреЙрди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рд╣рд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЖрдк рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЖрдк рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддреА рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреИрд╕реЗ рдФрд░ рдХреНрдпрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореИрдВ рдЗрд╕реЗ рд╕рд┐рдиреЙрди 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 );
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдпрд╣ рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдиреЛрдб рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: