Sinon: рдирд╛рдорд┐рдд рдЬрд╛рд╕реВрд╕

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдлрд╝рд░ре░ 2013  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: sinonjs/sinon

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

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

рдореИрдВ рдпрд╣ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ; рдпрд╣ рд╣рдореЗрд╢рд╛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдирд╛рдо proxy - рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ Object.defineProperty(spy, 'name', { value: 'new name' }) рддреЛ рдпрд╣ "рдирдпрд╛ рдирд╛рдо" рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

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

рд╕рд┐рдиреЙрди рд▓рд┐рдкрдЯреЗ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред рддреЛ рдЖрдк рдПрдХ рдЦрд╛рд▓реА рдирд╛рдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рдкреЗрдЯрдХрд░ рдЬрд╛рд╕реВрд╕ рдХрд╛ рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

var spy = sinon.spy(function doStuff() {});

рдпрд╣ рддрдХрдиреАрдХ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреЗрддреА рд╣реИ:

var spy = sinon.spy(function doStuff(a, b, c) {}); // spy.length === 3

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ "рдкреНрд░реЙрдХреНрд╕реА" рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рд╕рддреНрдп рд╣реИ?

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ "рдкреНрд░реЙрдХреНрд╕реА" рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рд╕рддреНрдп рд╣реИ?

рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рдЙрджрд╛рд╣рд░рдг рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

// test/index.js
var sinon = require('sinon');

var spy = sinon.spy(function doStuff() {
    console.log('Name: ' + spy.name);
});

spy();
тЮЬ  sinon-test node test/index.js 
Name: proxy

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

рдореИрдВ рдпрд╣ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ; рдпрд╣ рд╣рдореЗрд╢рд╛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдирд╛рдо proxy - рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ Object.defineProperty(spy, 'name', { value: 'new name' }) рддреЛ рдпрд╣ "рдирдпрд╛ рдирд╛рдо" рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛:

const mapMethod = sinon.spy(Array.prototype, 'map');
const methodName = map.wrappedMethod.name;
console.log(methodName); // 'map'

@Tbhesswebber рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЧреИрд░-рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрддрд╛ рд╣реИред

рдЖрд╣ ... рдЙрддреНрдХреГрд╖реНрдЯ рдмрд┐рдВрджреБред рдореИрдВ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдареНрдпрдХреНрд░рдо рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ Array.prototype рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рдЬреЛ рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдмрд╣реБрдд рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛!

рдкреАрдПрд╕ - рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдард┐рди рд╣реИ рдЬрдм рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ _trying_ рдХрд░ рд░рд╣реЗ рд╣реИрдВ!

рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

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

@mrodrick рдПрдХ рдореВрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╛рд╕реВрд╕ рдмрдирд╛рддреЗ рд╕рдордп, Object.defineProperty(spy, 'name', { configurable: true, value: spy.wrappedMethod.name }) рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

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

рдореБрдЭреЗ рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдкреАрдЖрдИ рдореЗрдВ spy.named(name) рднреА рд╣реИ ЁЯШЖ рдпрд╣ рдЬрд╛рд╕реВрд╕ рдкрд░ displayName рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд╛рдо рднреА рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдм рдЗрд╕ рдкрд░ рдПрдХ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред

#1987 рдХрд╛ рдкреИрдЪ v7.2.7 рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдВрддреЛрд╖рдЬрдирдХ рд╣реИ тЭдя╕П

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

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

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

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

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

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

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