<p>IE11μ—μ„œ μ°½ 개체의 μŠ€ν… 속성을 볡원 ν•  λ•Œ sinon이 μ‹€νŒ¨ν•©λ‹ˆλ‹€.</p>

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

버그 μ„€λͺ…
μŠ€ν…μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ IE11의 μ°½ κ°œμ²΄μ—μ„œ 일뢀 속성을 λ³΅μ›ν•˜μ§€ μ•Šμ•„ sinonμ—μ„œ μœ ν˜• 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. TypeError: Cannot redefine non-configurable property '...'

μž¬ν˜„ν•˜λ €λ©΄
https://jsbin.com/qixexucasa/edit?js , console, output-IE11κ³Ό λ‹€λ₯Έ λΈŒλΌμš°μ €μ˜ λ™μž‘μ„ λΉ„κ΅ν•©λ‹ˆλ‹€.

"TypeError: Cannot redefine non-configurable property 'parent'
   at restore (https://unpkg.com/[email protected]/pkg/sinon.js:3253:13)
   at Global code (https://null.jsbin.com/runner:18:1)"

μ˜ˆμƒλ˜λŠ” 행동
IE11μ—μ„œ μ°½ 개체의 νŠΉμ • 속성은 ꡬ성 ν•  수 μ—†μ§€λ§Œ μ—¬μ „νžˆ μŠ€ν…μ΄ κ°€λŠ₯ν•˜λ©° μ΄λŠ” ν…ŒμŠ€νŠΈμ—μ„œ 맀우 μœ μš©ν•©λ‹ˆλ‹€. μ˜ˆμƒλ˜λŠ” λ™μž‘μ€ λ‹€μŒ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

  1. sinon은 μŠ€ν… 단계 (restore () 단계가 μ•„λ‹˜)μ—μ„œμ΄ 속성을 μŠ€ν… ν•  수 μ—†λ‹€λŠ” 였λ₯˜λ₯Ό λ°œμƒμ‹œμΌœμ•Όν•©λ‹ˆλ‹€.
  2. sinon 속성을 μŠ€ν„° λΉ™ ν•  λ•Œ μ›λž˜ configurable 속성을 λ³΅μ‚¬ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€. κ·Έ μ΄μœ κ°€ μžˆμŠ΅λ‹ˆκΉŒ? false κ°’μ˜ 경우 sinon은 자체적으둜 문제λ₯Ό μΌμœΌν‚€κΈ° λ•Œλ¬Έμ— 볡원이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. λ”°λΌμ„œμ΄ 쀄은 항상 true μ΄μ–΄μ•Όν•©λ‹ˆλ‹€.
    https://github.com/sinonjs/sinon/blob/638e104d1e6ed9908c1b09bd33d2cba1aa8c217a/lib/sinon/default-behaviors.js#L251

λ¬Έλ§₯:

  • 라이브러리 버전 : λͺ¨λ“  버전이 영ν–₯μ„λ°›μœΌλ©° 4.4.6 및 6.1.5μ—μ„œ ν…ŒμŠ€νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

버그인지 μ˜ˆμƒλ˜λŠ” λ™μž‘μΈμ§€ ν™•μΈν•˜μ„Έμš”.

Bug Help wanted hacktoberfest pinned

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‚˜λŠ” 같은 λ¬Έμ œκ°€ 있고 sinon / default-behaviors.js 라인 258μ—μ„œ κ·Έ 원인을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

value: function value(fake, newVal) {
    var rootStub = fake.stub || fake;

    Object.defineProperty(rootStub.rootObj, rootStub.propName, {
        value: newVal,
        enumerable: true,
        configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)
    });

    return fake;
}

μ›λž˜ 개체의 ꡬ성 κ°€λŠ₯ν•œ μ˜΅μ…˜μ„ λ”°λΌμ•Όν•˜λŠ” 이유λ₯Ό λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μŠ€ν„°λ“œ ν›„μ—λŠ” μ›λž˜ 객체의 μ˜΅μ…˜μ— 관계없이 볡원 λ˜λŠ” 재 μž‘μ„± (일반적으둜 sinon.restore ()) ν•  수 있기 λ•Œλ¬Έμ— 항상 μ‚¬μ‹€μ΄μ–΄μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μΌμ‹œμ μœΌλ‘œ μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ—¬ 항상 trueλ₯Ό λ°˜ν™˜ν•¨μœΌλ‘œμ¨μ΄ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  4 λŒ“κΈ€

λ¬Έμ œμ— λŒ€ν•œ μžμ„Έν•œ μ„€λͺ…에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

두 번째 μ „λž΅μ„ μ‚¬μš©ν•˜λ©΄ μ‹€μ œλ‘œ IE11μ—μ„œ μž‘λ™ν•©λ‹ˆκΉŒ? κ·Έλ ‡λ‹€λ©΄ 그것이 λ‚΄κ°€ μ„ ν˜Έν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

ν•„μš”ν•œ 변경을 μœ„ν•΄ ν’€ λ¦¬ν€˜μŠ€νŠΈμ— κΈ°μ—¬ ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

이 λ¬Έμ œλŠ” 졜근 ν™œλ™μ΄ μ—†μ—ˆκΈ° λ•Œλ¬Έμ— μžλ™μœΌλ‘œ 였래된 κ²ƒμœΌλ‘œ ν‘œμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 더 이상 ν™œλ™μ΄ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©΄ νμ‡„λ©λ‹ˆλ‹€. κ·€ν•˜μ˜ 기여에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

이 λ¬Έμ œλŠ” 졜근 ν™œλ™μ΄ μ—†μ—ˆκΈ° λ•Œλ¬Έμ— μžλ™μœΌλ‘œ 였래된 κ²ƒμœΌλ‘œ ν‘œμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 더 이상 ν™œλ™μ΄ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©΄ νμ‡„λ©λ‹ˆλ‹€. κ·€ν•˜μ˜ 기여에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

λ‚˜λŠ” 같은 λ¬Έμ œκ°€ 있고 sinon / default-behaviors.js 라인 258μ—μ„œ κ·Έ 원인을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

value: function value(fake, newVal) {
    var rootStub = fake.stub || fake;

    Object.defineProperty(rootStub.rootObj, rootStub.propName, {
        value: newVal,
        enumerable: true,
        configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)
    });

    return fake;
}

μ›λž˜ 개체의 ꡬ성 κ°€λŠ₯ν•œ μ˜΅μ…˜μ„ λ”°λΌμ•Όν•˜λŠ” 이유λ₯Ό λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μŠ€ν„°λ“œ ν›„μ—λŠ” μ›λž˜ 객체의 μ˜΅μ…˜μ— 관계없이 볡원 λ˜λŠ” 재 μž‘μ„± (일반적으둜 sinon.restore ()) ν•  수 있기 λ•Œλ¬Έμ— 항상 μ‚¬μ‹€μ΄μ–΄μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μΌμ‹œμ μœΌλ‘œ μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ—¬ 항상 trueλ₯Ό λ°˜ν™˜ν•¨μœΌλ‘œμ¨μ΄ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

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