Sinon: μƒμ„±μžλ₯Ό κ°μ‹œ ν•  λ•Œ 슀파이의 thisValueκ°€ μΈμŠ€ν„΄μŠ€λ₯Ό 가리 킀지 μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 02μ›” 09일  Β·  10μ½”λ©˜νŠΈ  Β·  좜처: sinonjs/sinon

이 슀 λ‹ˆνŽ«μ€ Sinon 2.0.0μ—μ„œλŠ” 잘 μž‘λ™ν•˜μ§€λ§Œ Sinon 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 의 μ‹€μ œ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

이것은 Sinon 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 ν™•μž₯ν•©λ‹ˆλ‹€. λ°˜λŒ€λ‘œ newκ°€ μ‚¬μš©λ  λ•Œ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œλŠ” thisValue κ·ΈλŒ€λ‘œ λ‘‘λ‹ˆλ‹€.

우리 μ½”λ“œκ°€ μ΄κ²ƒμ˜ 단일 μš©λ„λ§Œμ„ 가지고 μžˆλ‹€λŠ” 점을 κ³ λ €ν•˜λ©΄, λ‚˜λŠ” sinon의 λ‚΄λΆ€λ₯Ό λ‘˜λŸ¬ μŒ€ μ‹œκ°„μ΄μ—†κ³  자격이 μ—†λ‹€κ³  느끼기 λ•Œλ¬Έμ— λΉ λ₯Έ 경둜둜 κ°€μ„œ 이것을 유발 ν•œ 우리의 단일 ν…ŒμŠ€νŠΈλ₯Ό λ³€κ²½ν•˜κ³  싢을 κ²ƒμž…λ‹ˆλ‹€. 잠재적으둜 획기적인 λ³€κ²½

λ§Žμ€ μ‚¬λžŒλ“€μ΄μ΄ λ¬Έμ œμ— λŒ€ν•΄ λΆˆν‰ν•˜μ§€ μ•ŠλŠ” 것 κ°™κΈ° λ•Œλ¬Έμ—, μ•„λ§ˆλ„ μ‚¬λžŒλ“€μ€ 일반적으둜 이런 λ°©μ‹μœΌλ‘œ ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šκ³  μˆ˜μ •ν•  κ°€μΉ˜κ°€ 없을 κ²ƒμž…λ‹ˆλ‹€ (단지 κ΄€μ°°, 결정은 μœ μ§€ κ΄€λ¦¬μžκΉŒμ§€).

일반적으둜 μ‚¬μš©λ˜μ§€ μ•Šκ±°λ‚˜ 적어도 μΌλ°˜μ μœΌλ‘œλ³΄κ³ λ˜μ§€ μ•ŠλŠ” κ²½μš°μ—λ„μ΄ νšŒκ·€λ₯Ό μˆ˜μ •ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

같은 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.이 문제λ₯Ό ν•΄κ²°ν•  κ³„νšμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

@ ivan-zakharchuk 아무도 μžμ›ν•˜μ§€ μ•ŠμœΌλ©΄ κ³„νšμ΄ μ—†μŠ΅λ‹ˆλ‹€. 당신이 그것을 고치고 μ‹Άλ‹€λ©΄, μ·¨ν•  μˆ˜μžˆλŠ” μžμ—°μŠ€λŸ¬μš΄ λ‹€μŒ 단계가 μžˆμŠ΅λ‹ˆλ‹€ ;-)

이것은 λ¬Έμ œκ°€λ˜λŠ” μ»€λ°‹μž…λ‹ˆλ‹€ : https://github.com/sinonjs/sinon/issues/1683#issuecomment -364794930

κ°„λ‹¨νžˆ λ§ν•΄μ„œ, λ‚˜λŠ” 이것에 λŒ€ν•œ μˆ˜μ •μ„ μœ„ν•΄ 였랜 μ‹œκ°„μ„ λ³΄λƒˆμ§€ 만 μ„±κ³΅ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. this κ°€μΉ˜μ˜ μ•…λͺ½μž…λ‹ˆλ‹€. 핡심 λ¬Έμ œλŠ” 여기에 제곡된 ν•¨μˆ˜λ₯Ό new ν•˜λ©΄ 본질적으둜 μƒˆλ‘œμš΄ this μƒμ„±ν•˜λŠ” 반면 thisValues[0] (μ›λž˜ κ²Œμ‹œλ¬Όμ—μ„œ μ‚¬μš©λ¨)λŠ” this μ°Έμ‘°ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€ new 에 μ˜ν•΄ 생성 된 this (예 : var some = new window.SomeClass(); )-맀우 ν˜Όλž€ μŠ€λŸ½μŠ΅λ‹ˆλ‹€.

본질적으둜, 이것을 κ³ μΉ˜λŠ” 것은 두 가지 방법을 μ‹œλ„ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€- new 호좜 this λ₯Ό μ˜λ―Έν•˜μ§€λ§Œ μš°λ¦¬λŠ” 두 번 ν˜ΈμΆœν•΄μ•Όν•©λ‹ˆλ‹€ (즉, OP의 ν…ŒμŠ€νŠΈμ—μ„œ ν•˜λ‚˜, proxy-invoke.js μ—μ„œ ν•˜λ‚˜) this es둜 끝날 κ²ƒμž…λ‹ˆλ‹€. λ‚΄κ°€ 생각할 μˆ˜μžˆλŠ” μœ μΌν•œ 것은 ν•˜λ‚˜μ˜ this μ—μ„œ λ‹€λ₯Έ κΈ°λŠ₯으둜 ν•¨μˆ˜λ₯Ό λ°”μΈλ”©ν•˜λŠ” κ²ƒμ΄μ—ˆμ§€λ§Œ, 이것에도 λ„ˆλ¬΄ μ—‰λ§μ΄μ—ˆκ³  λ‹€λ₯Έ λͺ‡ 가지λ₯Ό λ§μ³€μŠ΅λ‹ˆλ‹€.

μœ„μ˜ λ‚΄μš©μ΄ μ΄ν•΄λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. μ–Έμ œλ“ μ§€ μˆ˜μ • / μ„€λͺ…을 μš”μ²­ν•˜μ„Έμš”. new ν‚€μ›Œλ“œκ°€ μ‹€μ œλ‘œ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ— λŒ€ν•œ λ³΅μŠ΅μ„ 보렀면 μ—¬κΈ° λ₯Ό μ°Έμ‘° this λ§Œλ“­λ‹ˆλ‹€.

μ–΄μ¨Œλ“  λ‚΄κ°€ μ•Œμ•„ μ°¨λ¦° ν•œ κ°€μ§€λŠ” 911c498 (νšŒκ·€λ₯Ό λ„μž… ν•œ 컀밋)에 ES6 ν΄λž˜μŠ€μ—μ„œ new λ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λŠ” 문제λ₯Ό λ‹€λ£¨λŠ” ν…ŒμŠ€νŠΈκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” μ•„λ§ˆλ„ ν…ŒμŠ€νŠΈμ˜ linting μ˜΅μ…˜μ΄ ES5λ§Œμ„ μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— class ν‚€μ›Œλ“œλ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬ΈμΌ κ²ƒμž…λ‹ˆλ‹€. ν˜„μž¬ λ¬Έμ œμ— λŒ€ν•œ ν–₯ν›„ μˆ˜μ • 사항이 911c498의 μˆ˜μ • 사항을 ν•΄μ œν•˜μ§€ μ•Šλ„λ‘ ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. 관심이 있으면 홍보 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰