Sinon: рд╕реНрдкрд╛рдИ рдХрд╛ рдпрд╣ рд╡реИрд▓реНрдпреВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдЬрд╛рд╕реВрд╕реА рдХрд░рддреЗ рд╕рдордп рдЙрджрд╛рд╣рд░рдг рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

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

рдпрд╣ рд╕реНрдирд┐рдкреЗрдЯ рд╕рд┐рдиреЙрди 2.0.0 рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рд┐рдиреЙрди 4.2.2 рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ:

it('returns correct thisValue', function() {
    window.SomeClass = function() {
        this.counter = 0;
        this.inc = function() {
            this.counter++;
        };
        this.getCounter = function() {
            return this.counter;
        };
    };

    var spy = sinon.spy(window, 'SomeClass');
    var some = new window.SomeClass();
    some.inc();

    expect(spy.thisValues[0].counter).toEqual(1);
    expect(spy.thisValues[0].getCounter()).toEqual(1);
    some.inc();
    expect(spy.thisValues[0].counter).toEqual(2);
    expect(spy.thisValues[0].getCounter()).toEqual(2);
});

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ thisValues[0] рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рд╣реИ рдФрд░ some рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рд╕рд┐рдиреЙрди 4.2.2 рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд╣реИ:

Expected undefined to equal 1
TypeError: undefined is not a function (evaluating 'spy.thisValues[0].getCounter()')
Bug Medium Help wanted Regression hacktoberfest pinned

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

рднрд▓реЗ рд╣реА рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЖрдорддреМрд░ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕ рдкреНрд░рддрд┐рдЧрдорди рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рд╕рдордп рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП git bisect рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИ, рдЬреЛ рдХреБрдЫ рд╕реБрд░рд╛рдЧ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдЬрд╛рдирдмреВрдЭрдХрд░ (рдПрдХ рд╕реБрд╡рд┐рдзрд╛) рдерд╛ рдпрд╛ рдирд╣реАрдВ (рдПрдХ рдмрдЧ)ред

рдЙрджрд╛рд╣рд░рдг @PVince81 рдХреЛ рдПрдХ рдЫреЛрдЯреА рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ git bisect run рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк git bisect рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрддрд░ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЕрд╡рд╕рд░ рд╣реИ!

http://www.marclittlemore.com/how-to-find-bugs-using-git-bisect-with-this-easy-guide/

рдУрд╣, рдореБрдЭреЗ рджреНрд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИ! рдореИрдВ рдЗрд╕рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦреВрдВрдЧрд╛ ..

рдпрд╣рд╛рдВ рд╣рдо рдЬрд╛рддреЗ рд╣реИрдВ: 911c498dc14dc4034ba019526bf58f8b24d77da0 рдЬрд╛рд╕реВрд╕ new (#1626) рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдХреЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, @PVince81! рдПрдХ рдлрд┐рдХреНрд╕ # 1265 рдХрд╛ рднреА рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд░реНрд╢ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЬрд╛рд╕реВрд╕реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЬрдм рдХреЛрдИ рд╡рд╕реНрддреБ new рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ thisValue рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ thisValues ред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрдм рдирдпрд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡рд┐рдзрд┐ thisValue рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреА рд╣реИред

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

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХреА рд╣реИ, рд╢рд╛рдпрдж рд▓реЛрдЧ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдлрд┐рдХреНрд╕ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ (рдХреЗрд╡рд▓ рдПрдХ рдЕрд╡рд▓реЛрдХрди, рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдХреЛ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)

рднрд▓реЗ рд╣реА рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЖрдорддреМрд░ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕ рдкреНрд░рддрд┐рдЧрдорди рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдХреНрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

@ ivan-zakharchuk рдпрджрд┐ рдХреЛрдИ рд╕реНрд╡рдпрдВрд╕реЗрд╡рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ, рдирд╣реАрдВред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдЕрдЧрд▓рд╛ рдХрджрдо рдЙрдард╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ;-)

рдпрд╣ рдЖрдкрддреНрддрд┐рдЬрдирдХ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рд╣реИ: https://github.com/sinonjs/sinon/issues/1683#issuecomment -364794930

рдмрд╕ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рдХреНрд╕ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╕рдлрд▓ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ this рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рдмреБрд░рд╛ рд╕рдкрдирд╛ рд╣реИред рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ new рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдирдпрд╛ this рдмрдирд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ thisValues[0] (рдЬреИрд╕рд╛ рдХрд┐ рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) this рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ new рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ (рдпрд╛рдиреА var some = new window.SomeClass(); ) - рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рд╣реИред

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдЗрд╕реЗ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ - new рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ this , рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕реЗ рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛рдиреА рдУрдкреА рдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╕реЗ рдПрдХ рдФрд░ proxy-invoke.js ) ES6 рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рджреЛ this es рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рдерд╛, рд╡рд╣ рдереА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ this рд╕реЗ рджреВрд╕рд░реЗ рдкрд░ рдмрд╛рдВрдзрдирд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рднреА рд╡рд╣ рдмрд╣реБрдд рд╣реИрдХ рдерд╛ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛ред

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреГрдкрдпрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЛ рд╕рд╣реА/рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдПрдХ рдкреБрдирд╢реНрдЪрд░реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ рдХрд┐ new рдХреАрд╡рд░реНрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ - TLDR рдпрд╣ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ this рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рднреА рд╕рдВрджрд░реНрдн рд╣реЛред

рдХрд┐рд╕реА рднреА рддрд░рд╣, рдПрдХ рдмрд╛рдд рдореИрдВрдиреЗ рдиреЛрдЯрд┐рд╕ рдХреА рдереА рдХрд┐ 911c498 (рдкреНрд░рддрд┐рдЧрдорди рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛) рдореЗрдВ рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ - ES6 рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде new рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ред рдРрд╕рд╛ рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдирд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк class рдХреАрд╡рд░реНрдб рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ ES5 рдХреА рдкреВрд░реНрддрд┐ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдИ рднреА рдлрд┐рдХреНрд╕ 911c498 рдореЗрдВ рдлрд┐рдХреНрд╕ рдХреЛ рдЕрди-рдлрд┐рдХреНрд╕ рди рдХрд░реЗ - рдпрджрд┐ рд░реБрдЪрд┐ рд╣реЛ рддреЛ рдореИрдВ рдЗрд╕реЗ рдкреАрдЖрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

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

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

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

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

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

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

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