Sinon: рднрд╡рд┐рд╖реНрдп рдХреЗ рдореАрд▓ рдХреЗ рдкрддреНрдерд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░

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

рдкреГрд╖реНрдарднреВрдорд┐

sinon.stub / sandbox.stub рд░рд╕реЛрдИ рдХрд╛ рд╕рд┐рдВрдХ рдмрди рдЧрдпрд╛ рд╣реИ
рдЙрди рдореБрджреНрджреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рдЧрдорди рдХреЗ рдмрд┐рдирд╛ рдвреВрдВрдврдирд╛ рдФрд░ рдареАрдХ рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдореВрд▓ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕ рдкрд░ stub рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпрд╛рдВ рд╣реИрдВред

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

var myStub;

beforeEach(function(){
    myStub = sinon.stub().resolves('apple pie :)');
});

// several hundred lines of tests later
myStub = sinon.stub().rejects('no more pie :(');

// several hundred lines of tests later
// what behaviour does myStub currently have? Can you tell without 
// reading the entire file?
// can you safely change the behaviour without affecting tests further 
// down in the file?

рдФрд░ рдлрд┐рд░ рдФрд░ рдЕрдзрд┐рдХ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИрдВ

var myStub = sinon.stub()
                .withArgs(42)
                .onThirdCall()
                .resolves('apple pie')
                .rejects('no more pie')

рдпрд╣ рднреА рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?

stub рдореЗрдВ рдФрд░ рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░рд┐рдпрд╛рдБ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдирдП рд╕рджрд╕реНрдпреЛрдВ рдХреЛ sinon рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдПрдБ, рдЬреЛ рдХрд┐ рджрд╛рдпрд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрдХреАрд░реНрдг рд╣реИрдВред

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реНрдЯреИрдВрдб рд╣реЛрдЧрд╛ред

рдлрд┐рд░ рд╣рдо рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рдПрдХ рдЕрд▓рдЧ, рдирдП, рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ)ред

sinon.fake

рдПрдХ fake ( sinon.fake рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп) рдПрдХ рд╢реБрджреНрдз рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп Function рд╣реИред рдпрд╣ рдПрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдкрд░ рдЗрд╕рдХрд╛ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИред stub рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рднрд┐рдиреНрди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдирдпрд╛ fake рдмрдирд╛рдПрдВред

рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА

рдирдХрд▓реА рдХреЗ рдкрд╛рд╕ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ

  • рдПрдХ Promise рдХреЛ рдПрдХ рдорд╛рди рдореЗрдВ рд╣рд▓ рдХрд░реЗрдВ
  • Promise рдХреЛ Error . рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ
  • рдПрдХ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░реЗрдВ
  • рдПрдХ Error . рдлреЗрдВрдХреЛ
  • рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдЬ рдореВрд▓реНрдп

рдпрджрд┐ рдЖрдк рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ / рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдЕрднреА рднреА рд╕реНрдкрд╛рдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╛ рддреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, stub рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ рдПрдХ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ

sinon.replace(myObject, myMethod, sandbox.spy(function(args) {
    someFunctionWithSideEffects(args);
});

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрджрд╛рд░рддрд╛рдкреВрд░реНрд╡рдХ рдлреЗрдВрдХрддрд╛ рд╣реИ

рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрд╕рдорд░реНрдерд┐рдд рддрд░реАрдХреЛрдВ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ/рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдореЗрдВ рдЙрджрд╛рд░ рд╣реЛрдЧрд╛ред

// will throw TypeError when `config` argument has more than one property
const fake = sinon.fake({
    resolves: true, 
    returns: true
});

рдЬрд╛рд╕реВрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

.withArgs рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ

рдЙрдкрдпреЛрдЧ рдХреЗ рд╡рд┐рдЪрд╛рд░

// will return a Promise that resolves to 'apple pie'
var fake = sinon.fake({resolves: 'apple pie'})

// will return a Promise that rejects with the provided Error, or 
// creates a generic Error using the input as message
var fake = sinon.fake({rejects: new TypeError('no more pie')});
var fake = sinon.fake({rejects: 'no more pie'});

// returns the value passed
var fake = sinon.fake({returns: 'apple pie'});

// throws the provided Error, or creates a generic Error using the 
// input as message
var fake = sinon.fake({throws: new RangeError('no more pie')});
var fake = sinon.fake({throws: 'no more pie'});

// replace a method with a fake
var fake = sinon.replace(myObject, 'methodName', sandbox.fake({
    returns: 'apple pie'
}))
// .. or use the helper method, which will use `sandbox.replace` and `
// sinon.fake`
var fake = sinon.setFake(global, 'methodName', {
    returns: 'apple pie'
});

// create an async fake
var asyncFake = sinon.asyncFake({
    returns: 'apple pie'
});

рд╕рдорд╛рдирд╛рд░реНрдереА рд╢рдмреНрдж

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ fake рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕рдВрдЬреНрдЮрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рдВрдЬреНрдЮрд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдкрд░рдВрдкрд░рд╛ рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рд╡рд┐рд╢реЗрд╖рдгреЛрдВ рдпрд╛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рднрдЯрдХрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

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

рд╣рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ sinon.* рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдЬрд╛рдЧрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ sinon.stub sandbox.stub рдХреЗ рд╕рдорд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ sinon.stub рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рд╕реАрдорд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред

sandbox.replace

sandbox.replace рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ рдЬреЛ рдХрд╣реАрдВ рднреА рдХреБрдЫ рднреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ sinon.replace рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЗрд╕рдореЗрдВ рд╢рд╛рдпрдж рдХреБрдЫ рдЧрдВрднреАрд░ рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛, рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдЗрддреНрдпрд╛рджрд┐ред

Feature Request Improvement Needs investigation pinned

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

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдПрдХ рд╕рдорд╛рди рд╕рдордЭ рд╣реИ

рдмрд╕ рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдо рдХреБрдЫ рдЪреВрдХ рдЧрдП рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреА рдпрд╣реА рд╕рдордЭ рд╣реЛрдЧреАред

рдЯреАрдПрд▓; рдбреАрдЖрд░

  • рд╕рднреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдПрдХ рдирдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ: sandbox.replace (рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ stub рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ)
  • sinon рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╣реЛрдЧрд╛, рдЬреЛ sinon.reset рдФрд░ sinon.restore рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдорд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?)
  • sinon.fake тАФ рд╕рднреА рдХреЙрд▓реЛрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпреЛрдЧреНрдп рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди
  • sinon.spy
  • sinon.stub
// effectively a spy that has no target
const fake = sinon.fake()

// spy on a function
const fake = sinon.fake(console.log);
const fake = sinon.fake(function() { return 'apple pie'; });

// a shorthand construction of fake with behaviour
const fake = sinon.fake({
    returns: 'apple pie'
});

// replacing an existing function with a fake
var fakeLog = sinon.fake();
sandbox.replace(console, 'log', fakeLog);

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗрд╡рд▓ Function рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╣рдореЗрдВ рдЧреИрд░-рдХрд╛рд░реНрдп рдЧреБрдгреЛрдВ рдФрд░ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо, рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдХреЗрд╡рд▓ рд╕рдордЭрджрд╛рд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП sandbox.replace рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдкрд┐рдВрдЧ @sinonjs/core

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

рд╕рд┐рдиреЙрди.рдирдХрд▓реА

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрдкрдЬ рдФрд░ рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

sinon.fake({
  yields: [null, 42],
  returns: true
})

рд╣рдо рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВред

рд╕рд╛рде рд╣реА, рдЕрдЧрд░ рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ callsThrough: true рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рд╡реНрдпрд╡рд╣рд╛рд░ рдЧреБрдгреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЕрдорд╛рдиреНрдп рд╣реИ), рддреЛ "рд╕реНрдкрд╛рдИ" рдПрдкреАрдЖрдИ рдХреЗ рдмрдЬрд╛рдп рдирдП рдирдХрд▓реА рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд┐рдиреЛрди-рд╕реНрдкреАрдХ рдореЗрдВ "рдЬрд╛рд╕реВрд╕" рдФрд░ "рд╕реНрдЯрдм" рдХрд╛ рдЕрд░реНрде рдХреНрдпрд╛ рд╣реИ, рдпрд╣ рд╕реАрдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдЕрдзрд┐рдХ рдЖрддреНрдо-рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рд╣реЛрдЧрд╛ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдЬрдмрдХрд┐ рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж sinon.restore() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдХреБрдЫ рдмрдЪреЗ рд╣реБрдП рдУрд╡рд░ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╛ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдЬреЛ рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдП рдереЗред рдкрд░реАрдХреНрд╖рдг рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЛ beforeEach рдореЗрдВ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╢рд╛рдирджрд╛рд░ рдЪреАрдЬ рд╕рдХреНрд╖рдо рд╣реЛрдЧреАред рдореИрдВ

рд╕реИрдВрдбрдмреЙрдХреНрд╕.рдмрджрд▓реЗрдВ

рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИред рдореИрдВ рдЗрд╕реЗ "рдмрд╕ рдореБрдЭреЗ рдЗрд╕ рдЪреАрдЬрд╝ рдХреЛ рд╡рд╣реАрдВ рд░рдЦрдиреЗ рджреЗрдВ" рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд╣реИ рдирд╛?

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

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ spy рдпрд╛ stub рдХреА рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА?

рд╕реИрдВрдбрдмреЙрдХреНрд╕.рдмрджрд▓реЗрдВ

рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИред рдореИрдВ рдЗрд╕реЗ "рдмрд╕ рдореБрдЭреЗ рдЗрд╕ рдЪреАрдЬрд╝ рдХреЛ рд╡рд╣реАрдВ рд░рдЦрдиреЗ рджреЗрдВ" рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд╣реИ рдирд╛?

рд╣рд╛рдБ, рд╡рд╣ рд╡рд┐рдЪрд╛рд░ рдерд╛ред рдПрдХ рд╣реА рд╡рд┐рдзрд┐ ( sinon.stub ) рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрдИ рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, fake рдПрдкреАрдЖрдИ рд╢рд╛рдпрдж рд╣рд░ рдЙрд╕ рдЪреАрдЬ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬрд╛рд╕реВрд╕реЛрдВ рдФрд░ рд╕реНрдЯрдмреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ fake API stub рдФрд░ spy рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд╡рд╕рд░ рд╣реИред

рдЬрдмрдХрд┐ рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж sinon.restore() рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдХреБрдЫ рдмрдЪреЗ рд╣реБрдП рдУрд╡рд░реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реИ - рдпрд╛ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдЬреЛ рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖ рдерд╛ред рдпрд╣ рд╢рд╛рдирджрд╛рд░ рдЪреАрдЬ рдкрд░реАрдХреНрд╖рдг рдЕрд▓рдЧрд╛рд╡ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╕реЗ рдкрд╣рд▓реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧреАред рдореИрдВ

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдмрджрд▓рд╛рд╡ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдореЗрдВ рдкреЗрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

fake рдмрдирд╛рддреЗ рд╕рдордп, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ spy рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред

// ~spy, records all calls, has no behaviour
const fake = sinon.fake();

// ~stub, records all calls, returns 'apple pie'
const fake = sinon.fake({
    returns: 'apple pie'
});

рдЖрдк рдПрдХ рдРрд╕рд╛ рдареВрдВрда рдХреИрд╕реЗ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рддрдм рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛?

рдЖрдк рдПрдХ рдРрд╕рд╛ рдареВрдВрда рдХреИрд╕реЗ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рддрдм рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛?

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ... рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЬрд╛рддрд╛ рд╣реИ

// a fake that has no behaviour
const fake = sinon.fake();

// put it in place of an existing method
sandbox.replace(myObject, 'someMethod', fake);

рдЖрд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдм рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ: fake рд╣рдореЗрд╢рд╛ stub рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдЖрдкрдиреЗ ~spy, records all calls рдХрд╣рд╛ рддреЛ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ рдХрд┐ "рдХреЙрд▓ рдереНрд░реВ рдСрд░рд┐рдЬрдирд▓ рдлрдВрдХреНрд╢рди"ред рд╣рд╛рд▓рд╛рдВрдХрд┐, fake рдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡рд╣ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ - рдпрд╣реА рд╡рд╣ рд╣реИ рдЬреЛ sandbox.replace рдХрд░рддрд╛ рд╣реИред

рддреЛ рдЗрд╕ рдмрд╛рдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди spy рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (рдЬреИрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ) рдХреЛ рдирдП рдирдХрд▓реА рдореЗрдВ рдХреИрд╕реЗ рдореЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

const fake = sinon.fake(function () {
   // Any custom function
});

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

sandbox.spy(object, method) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрдм рдпрд╣ рдмрди рд╕рдХрддрд╛ рд╣реИ:

const original = object[method];
const fake = sinon.fake(original);
sandbox.replace(object, method, fake);

рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ-рд▓рд╛рдЗрдирд░ ЁЯдУ

рд╣рд╛рдВред рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдордиреЛрд░рдВрдЬрди рдФрд░ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдорд┐рд▓рд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо рдХреЗрд╡рд▓ fake рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдУрд░ рдЕрдЧреНрд░рд╕рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЕрдм spy рдФрд░ stub рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╢рд╛рдпрдж рдЙрди рджреЛрдиреЛрдВ рдХреЛ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдпрд╣рд╛рдВ "рдЕрдЧрд▓рд╛" рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред рдХрд╣реАрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рддрд░реНрдХ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ sandbox.spy рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рдкрд┐рдЫрдбрд╝рд╛ рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддрдм stub рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред

рдХрд╣реАрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рддрд░реНрдХ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ sandbox.spy рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рдкрд┐рдЫрдбрд╝рд╛ рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддрдм рд╕реНрдЯрдм рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЬрд╝рд░реВрд░ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЖрдк рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ stub API рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╕реНрдЯрдмреНрд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде spy рдмрдирд╛рдХрд░ рд╣реИред рдореИрдВ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ fake рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ spy рдмрдирд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдм рдХреЛрдИ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд▓реМрдЯрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЪреЗрдирд┐рдВрдЧ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ . рд╣рдо рдмрд╕ рдЬрд╛рд╕реВрд╕ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗред рдпрд╣ fake рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ stub рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓реМрдЯрд╛ рд╣реБрдЖ рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рдореМрдЬреВрджрд╛ рд╕рд┐рдиреЙрди рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ?

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдПрдХ рд╕рдорд╛рди рд╕рдордЭ рд╣реИ

рдмрд╕ рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдо рдХреБрдЫ рдЪреВрдХ рдЧрдП рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреА рдпрд╣реА рд╕рдордЭ рд╣реЛрдЧреАред

рдЯреАрдПрд▓; рдбреАрдЖрд░

  • рд╕рднреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдПрдХ рдирдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ: sandbox.replace (рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ stub рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ)
  • sinon рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╣реЛрдЧрд╛, рдЬреЛ sinon.reset рдФрд░ sinon.restore рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдорд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?)
  • sinon.fake тАФ рд╕рднреА рдХреЙрд▓реЛрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпреЛрдЧреНрдп рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди
  • sinon.spy
  • sinon.stub
// effectively a spy that has no target
const fake = sinon.fake()

// spy on a function
const fake = sinon.fake(console.log);
const fake = sinon.fake(function() { return 'apple pie'; });

// a shorthand construction of fake with behaviour
const fake = sinon.fake({
    returns: 'apple pie'
});

// replacing an existing function with a fake
var fakeLog = sinon.fake();
sandbox.replace(console, 'log', fakeLog);

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗрд╡рд▓ Function рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╣рдореЗрдВ рдЧреИрд░-рдХрд╛рд░реНрдп рдЧреБрдгреЛрдВ рдФрд░ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо, рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдХреЗрд╡рд▓ рд╕рдордЭрджрд╛рд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП sandbox.replace рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ sinon.stub() рдФрд░ sinon.spy() рджреЛрдиреЛрдВ рдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ sinon.fake() рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдмрд╕ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЯреЗрд╕реНрдЯ рдбрдмрд▓ рдХреА рд╕реЛрдЪ рдХреА рдУрд░ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВред рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдПрдХ рдмреБрд░реА рдЪреАрдЬ, рдЖрдИрдПрдордПрдЪрдУ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ sinon.fake() рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕рднреА рд╕рд┐рдиреЙрди рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рддреЛ рд╡реЗ рдмрд╕ рдПрдХ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рд╕рд┐рдиреЙрди рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рдЕрдкрдиреЗ рд╕рднреА рдореМрдЬреВрджрд╛ рдЬреНрдЮрд╛рди рдХреЛ рдЦреЛ рджреЗрдВрдЧреЗ)ред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм sinon.stub() рдФрд░ sinon.spy() рджреЛрдиреЛрдВ рдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ sinon.fake() рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдмрд╕ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЯреЗрд╕реНрдЯ рдбрдмрд▓ рдХреА рд╕реЛрдЪ рдХреА рдУрд░ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рдУрд╡рд░рд▓реИрдк рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░реЗрд░рдгрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдирдХрд▓реА рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╣реИред

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

рдпрджрд┐ рд▓реЛрдЧ рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рд╕реАрдЦрдиреЗ рдореЗрдВ рдорджрдж рдХреА :)

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдореА рдХреЗ рд╕рд╛рде рдЬрд╛рд╕реВрд╕реА рдФрд░ рд╕реНрдЯрдм рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд░рдЦреЗрдВрдЧреЗ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ? рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрд╕реНрдкрд╖реНрдЯ рдерд╛ред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдореА рдХреЗ рд╕рд╛рде рдЬрд╛рд╕реВрд╕реА рдФрд░ рд╕реНрдЯрдм рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд░рдЦреЗрдВрдЧреЗ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ?

рдПрдХ рдмрд╛рд░ fake рд╕реНрдерд┐рд░ рджрд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ spy рдФрд░ stub рдХреЛ рд╣рдЯрд╛ рджреВрдВрдЧрд╛, рдФрд░ рдлрд┐рд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рд╡рд░реНрд╖ рдХреА рддрд░рд╣ рджреВрдВрдЧрд╛ред

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

рдореИрдВ рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реИрдВрдбрдмреЙрдХреНрд╕) рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдЦрд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ sandbox рдФрд░ collection рдЕрдм рдПрдХ рд╣реЛ рдЬрд╛рдПрдВред рдореБрдЭреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдЕрдЧрд▓реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдХрд╛рдореЛрдВ рдХреЛ рдареАрдХ рдХрд░ рджреВрдВрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЕрджреНрдпрддрди рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЗрд╕ рднрдВрдбрд╛рд░ рдкрд░ рдПрдХ рд╢рд╛рдЦрд╛ рдмрдирд╛рдЙрдВрдЧрд╛ред

рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВред

рдореИрдВ рд╕реНрдЯрдмреНрд╕ рдФрд░ рдЬрд╛рд╕реВрд╕реЛрдВ рдХреЛ рдмрд╣рд┐рд╖реНрдХрд░рдг рдиреЛрдЯрд┐рд╕ рднреА рдЬреЛрдбрд╝реВрдВрдЧрд╛ред

рдореИрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ред

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдн рдЬреЛрдбрд╝ рджреЗрдЧрд╛:

  • рдпрд╣ рд╣рдореЗрдВ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ type рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ typescript рдпрд╛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд┐рд░ рдЪреЗрдХрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
  • рдЙрди рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓реЗрдВрдЧреА рдЬреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ
  • рд╣рдо рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдФрд░ рднреА рдмреЗрд╣рддрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ
  • рд╣рдо рдЙрди рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрди рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рд╕реЗ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ/рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рддрд░реНрдХ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ
  • рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рдмрдирд╛ рджреЗрдЧрд╛ (рднрд▓реЗ рд╣реА рдореБрдЭреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рдорд▓реЗ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реЗ рд╣реИрдВ) рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдмрдирд╛рдП рдЧрдП рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
  • рдЖрдИрдПрдордУ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБ рд░рдЦрдиреЗ рд╕реЗ рднреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛

рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдкреАрдЖрдИ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

// It would be cool to allow users to import these using destructuring to make code more concise
import { resolves, rejects, returns } from 'sinon/behaviors'; 

var fake = sinon.fake(resolves('apple pie'))

var fake = sinon.fake(rejects(new TypeError('no more pie')));
var fake = sinon.fake(rejects('no more pie'));

var fake = sinon.fake(returns('apple pie'));

var fake = sinon.fake(throws(new RangeError('no more pie'));
var fake = sinon.fake(throws('no more pie'));

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

рд╕рд╛рде рд╣реА, рдЬрдм onThirdCall рдФрд░ withArgs рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬреЛ рд╣реЛрддрд╛ рд╣реИ рдЙрд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрддрдиреА рджреЗрд░ рд╕реЗ рдЗрд╕рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдорд╣реАрдиреЗрдВ рдмрд╣реБрдд рд╡реНрдпрд╕реНрдд рдереЗред

@lucasfcosta рдкреАрдЖрд░ #1586 рджреЗрдЦреЗрдВ

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

5.0.0 рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг w/ рдмрд╛рдж рдХреЗ 5.0.0-рдЕрдЧрд▓реЗред * рдкреИрдХреЗрдЬ.json рдореЗрдВ рдкреВрд░реНрд╡-рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ 5.0.0 рдХрд┐рд╕реА рднреА рдкреВрд░реНрд╡-рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред

рдЪреВрдБрдХрд┐ 5.0.0 рд╡рд╣рд╛рдБ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ next рдкреВрд░реНрд╡-рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╢рд╛рдпрдж 5.0.1-next.1 рддрдХ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдФрд░ рдкреИрдХреЗрдЬ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдПрдХ рдмрд╣рд┐рд╖реНрдХреГрдд рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЙрд╕рдХрд╛ рдкреИрдХреЗрдЬред рдЬреЗрд╕рди "sinon": "^5.0.0-next.4" рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ

npm WARN deprecated [email protected]: this version has been deprecated

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

рдПрдХ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдЕрдЧрд▓реЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬрд╛рд░реА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ @ sinonjs/core?

@mroderick рдореИрдВ рдЕрдм рдФрд░ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ v5 рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреНрдпрд╛ рд╣реИрдВред рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдЗрд╕рдиреЗ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдореИрдВ рдирдП рдирдХрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВред рдпрд╣ рдПрдХ рдирдпрд╛ рдореЗрдЬрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╢рд┐рдк рдХрд░реЗрдВ

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЕрдЧрд▓рд╛ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░реЗрдВ, рдмрд╕ рдПрдХ рдФрд░ рдкреАрдЖрд░ #1764 рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдорд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдореИрдВрдиреЗ [email protected] рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЗрд╕ рджреМрд░рд╛рди рд▓реЛрдЧреЛрдВ рдХрд╛ рдЬреАрд╡рди рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ package.json рдФрд░ "sinon": "^5.0.1" рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ (рд╣рдореЗрд╢рд╛ рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ) рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЛрдИ рдорд┐рд▓рд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ (рдЕрднреА рддрдХ рдХреЛрдИ рд░рд┐рд▓реАрдЬ рдирд╣реАрдВ рд╣реИ), рдФрд░ "sinon": "^5.0.1-next.1" рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдХрднреА рднреА рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рдереА, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдЬрд╛рдЧрд░реВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ v5 рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЗрд╕реЗ рдХрдм рддрдХ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд░рд┐рд▓реАрдЬ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

fake рдХреЛ #1768 рдХреЗ рд╕рд╛рде рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ [email protected] . рдмрди рдЧрдпрд╛

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

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

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

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

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

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

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