Sinon: рд░реИрдк ES5 рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕

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

var o = {
  get foobar() { return 'foobar' },
  set foobar(s) { throw 'bzzt!' },
  foo: function() { return 'foo' },
  bar: 'bar'
}; // -> { foobar: [Getter/Setter], foo: [Function], bar: 'bar' }

sinon.mock(o).expects('foobar').returns('woohoo'); // doesn't because sinon.wrapMethod() does an object[property] which accesses the getter which returns a string

рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП Object.getOwnPropertyDescriptor(obj, prop) рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА Object.getPrototypeOf(obj) рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рдкрд╛рд╕ 'get' рдФрд░ 'set' рд╕рдВрдкрддреНрддрд┐ рдЬрд╣рд╛рдВ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд▓реЗрдХрд┐рди, рдЖрдк рд╕рд┐рд░реНрдл рдЧреЗрдЯрд░ рдпрд╛ рд╕рд┐рд░реНрдл рд╕реЗрдЯрд░ рдпрд╛ рджреЛрдиреЛрдВ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ? рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк:

mock(o).expects('foobar'); // ambiguous, the setter? getter? or both?
mock(o).expects('get foobar'); // ambiguous, there may be a legitimate property named "get foobar"
mock(o).expectsGet('foobar'); // clear but more code in Sinon and more to document ?
mock(o).expectsSet('foobar'); // ditto

рдФрд░ рд╕рд╛рде рд╣реА, рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдореНрдореЗрд▓рди рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рд╡реЗрд╢ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЕрдЧрд░ рдХреЛрдИ рдЖрдИрдИ 6 рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

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

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

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

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

рд╡реИрд╕реЗ рднреА, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕реНрдЯрдм рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рддреЛ рдЗрд╕реЗ рдкреНрд░реЙрдкрд░реНрдЯреА рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛? рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

stub(o, "foobar", { get: function () { return 42; } });

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

рдЙрджрд╛рд╣рд░рдг рд╕рд░рд▓ рдерд╛ред рдЬрд┐рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдкрд░ рдореИрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЙрд╕реЗ get identifier рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдПрдХ рд╕рд╛рде рдЬреБрдбрд╝рддреА рдереАрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЙрди рдЬрдЧрд╣реЛрдВ рд╕реЗ рдЖрдИ рдереАрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдореИрдВ рдмрд╕ рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ x.identifier рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рдЬреЛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЙрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд░рдЦреЗрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ getIdentifier() рд╕рд╛рде рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рд┐рдиреЙрди рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ/рдЪрд╛рд╣рд┐рдП?

рдЗрд╕ рдкрд░ рдЕрднреА рднреА рдХреБрдЫ рддрдп рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдХреБрдЫ рджреЗрд░ рдЖрд░рд╛рдо рдХрд░реЗрдВрдЧреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдлреИрд╕рд▓рд╛ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рдЗрдирдкреБрдЯ/рд╕реБрдЭрд╛рд╡ рд╣реИрдВ, рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рд▓рд┐рдЦреЗрдВред

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

рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╕рд┐рдиреЙрди рдореЗрдВ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

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

+1
рдореБрдЭреЗ рднреА рдЗрд╕рдХреА рдпрд╛рдж рдЖрддреА рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрдм рдЙрди рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рдЬреИрд╕реЗ рдлрд╛рдЗрд▓реЛрдВ, рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рдЧреЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЕрдореВрд░реНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЙрди рдЧреЗрдЯрд░реНрд╕ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

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

рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП +1!

:+1: рдореБрдЭреЗ рднреА рдмрд╕ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╣рд╕реВрд╕ рд╣реБрдИред

:+1: рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ES6 рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдореБрдЭреЗ expectsGet рд╡реИрд░рд┐рдПрдВрдЯ рдкрд╕рдВрдж рд╣реИред

+1 рдореИрдВ @simonzack . рд╕реЗ рддрд╣реЗ рджрд┐рд▓ рд╕реЗ рд╕рд╣рдордд

+1

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

рдХреНрдпрд╛ https://github.com/mroderick/wapple рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрд╕ рдЕрдВрддрд░ рдХреЛ рдкреНрд▓рдЧ рдХрд░рддрд╛ рд╣реИ?

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

+1 рдмрд╕ рд╕рд┐рдиреЙрди рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рдЧреЗрдЯрдЯрд░ рдореЙрдХрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ

рд╣рд╛рдп @derwaldgeist , рдХреНрдпрд╛ рдЖрдк

рдирд╡реАрдирддрдо sandboxes рдФрд░ sinon.stub рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдЯрдмрд┐рдВрдЧ рдЧреЗрдЯрд░реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдЖрдкрдХреЛ рдХреЗрд╡рд▓ get рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

var myObj = {
    prop: "foo"
};

createStub(myObj, "prop").get(function getterFn() {
    return "bar";
});

myObj.prop // "bar"

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╣реИ рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рдФрд░ рд╕рдВрджреЗрд╣ рд╣реИред

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

рд╣рд╛рдп @derwaldgeist ,

рдЧреЗрдЯрд░реНрд╕ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рд╕реНрдЯрдм рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдВред рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдмрдирд╛рдП рдЧрдП рд╕реНрдЯрдм рдореЗрдВ restore рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

var myObj = {
    prop: "foo"
};

var stub = createStub(myObj, "prop");

stub.get(function getterFn() {
    return "baz";
});

myObj.prop // "baz"

stub.restore();

myObj.prop // "foo"

рд╣рдо рдЗрд╕ restore рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдпрд╛ рддреЛ stub рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реА (рдЬрдм рдПрдХ рдЧреИрд░-рдХрд╛рд░реНрдп рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реНрдЯрдмрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ) рдпрд╛ wrapMethod рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореЗрдВ ред

рд╡рд╛рд╣, рд╡рд╣ рддреЗрдЬрд╝ рдерд╛ред рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА:

 const stub = sinon.stub(myObj, 'prop');
 stub.get(() => ({}));
  ...
 stub.restore();

рд▓реЗрдХрд┐рди рдЬрдм рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ () рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╣рддрд╛ рд╣реИ: Cannot redefine property: prop

рдЖрдкрдХреА createStub рд╡рд┐рдзрд┐ рдХрд╣рд╛рдБ рд╕реЗ рдЖрддреА рд╣реИ?

@derwaldgeist рдореБрдЭреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдорд┐рд▓рд╛, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА, рдпрд╣ sinon.stub рдЬреИрд╕рд╛ рд╣реА рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╕рд┐рдиреЙрди рдХреЗ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХреВрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрднреА рддрдХ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдордиреЗ рдПрдХ рдмрдЧ рддрдп рдХрд┐рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк configurable: true рдмрд┐рдирд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдХрд╛рд░рдг рдЧреБрдгреЛрдВ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдирдХреЗ рд╡рд┐рд╡рд░рдгрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдереЗред

рдореИрдВ @derwaldgeist рдЬреИрд╕рд╛ рд╣реА рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ _рдерд┐рдВрдХ_ рдореИрдВ v4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрдиреНрдп рд╡рд┐рднрд╛рдЧ v1.7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ _actually_ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдПрдХ sinon.version рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдЬрд╣рд╛рдВ рдореИрдВ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

@jshado1 рдпрджрд┐ рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╣реИрдВ, рддреЛ рдЖрдк sinon.stub({}, 'nonExistingProperty') рдлреЗрдВрдХрддрд╛ рд╣реИ

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

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

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

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

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

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

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