Sinon: "TypeError : Cannot read property 'now'of undefined"λ•Œ sinon.useFakeTimers ()

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

버그 μ„€λͺ…
sinon.useFakeTimers() ν•  λ•Œ sinon @ 6.1.0 μ‚¬μš©-였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

TypeError: Cannot read property 'now' of undefined
      at mirrorDateProperties (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:3644:1)
      at hijackMethod (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:3947:1)
      at Object.install (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:4337:1)
      at useFakeTimers (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:4385:1)
      at Sandbox.useFakeTimers (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:15390:1)
      at Context.<anonymous> (dist/webpack:/tests/unit/Countdown.spec.js:23:1)

sinon @ 5둜 λ‹€μš΄ κ·Έλ ˆμ΄λ“œν•˜λ©΄ λͺ¨λ“  것이 μ •μƒμž…λ‹ˆλ‹€!

λ‚΄ μ €μž₯μ†Œ :
https://github.com/moraveyo/chess-clock/blob/bf764f3ed9026366de9375bbc870109e4f007099/tests/unit/Countdown.spec.js#L23

μ»¨ν…μŠ€νŠΈ (λ‹€μŒ 정보λ₯Ό μž‘μ„±ν•˜μ‹­μ‹œμ˜€) :

  • 라이브러리 버전 : 6.1.0
  • ν™˜κ²½ : Ubuntu 16.04
  • URL 예 :
  • μ‚¬μš©μ€‘μΈ 기타 라이브러리 :

    • "vue": "^ 2.5.16",

    • "vue-router": "^ 3.0.1"

    • "@ vue / cli-plugin-babel": "^ 3.0.0-beta.15",

    • "@ vue / cli-plugin-eslint": "^ 3.0.0-beta.15",

    • "@ vue / cli-plugin-unit-mocha": "^ 3.0.0-beta.15",

    • "@ vue / cli-service": "^ 3.0.0-beta.15",

    • "@ vue / eslint-config-airbnb": "^ 3.0.0-rc.3",

    • "@ vue / test-utils": "^ 1.0.0-beta.16",

    • "chai": "^ 4.1.2",

    • "vue-template-compiler": "^ 2.5.16"

    • λͺ¨μΉ΄ 5.2.0

    • μ›ΉνŒ© 4.15.1

Help wanted stale

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

@mroderick μ €λŠ” sinon.useFakeTimers 톡해 κΈ€λ‘œλ²Œ μ»¨ν…μŠ€νŠΈλ₯Ό μ „λ‹¬ν•˜λŠ” 방법을 κ΅¬ν˜„ν•˜λŠ” PR (# 1935)을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. 이것이 μ—Όλ‘μ—λ‘κ³ μžˆλŠ” API의 μ’…λ₯˜μΈμ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. !

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

[email protected] 와 λ™μΌν•œ 문제 : 싀망 :
[email protected] κ°€ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

ν₯미둜운 ν˜„μƒ. 바닐라 Angular ν”„λ‘œμ νŠΈμ™€ Sinon 6.1.0을 μ‚¬μš©ν•˜μ—¬ 이것을 λ³΅μ œν•˜λ €κ³  μ‹œλ„ν–ˆμ§€λ§Œ useFakeTimers ()λŠ” λ‚˜μ—κ²Œ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠμœΌλ―€λ‘œ ν”„λ‘œμ νŠΈ ν™˜κ²½ μžμ²΄μ— λ¬Έμ œκ°€μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

였λ₯˜ λ©”μ‹œμ§€μ—μ„œ λ‚΄ 생각 에이 λ³€μˆ˜ λŠ” μ–΄λ–»κ²Œ λ“  μ •μ˜λ˜μ§€ μ•Šμ€ κ²ƒμž…λ‹ˆλ‹€.

@moraveyo 문제λ₯Ό λ³΄μ—¬μ£ΌλŠ” μ΅œμ†Œν•œμ˜ 예제둜

Stack Overflowμ—λŠ” μ΅œμ†Œ, μ™„μ „ 및 검증 κ°€λŠ₯ν•œ 예제λ₯Ό λ§Œλ“œλŠ” 방법에 λŒ€ν•œ κ°€μ΄λ“œ

μ§€κΈˆμ€ μ‹œκ°„μ΄λ³„λ‘œ μ—†μ–΄ λ―Έμ•ˆ ν•΄μš”.

@mroderick 였늘이 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ 문제λ₯Ό λ³΅μ œν•˜λŠ” μž‘μ€ μ €μž₯μ†Œμž…λ‹ˆλ‹€. μ—¬κΈ° .

버그가 ν‘œμ‹œ 되렀면 webpack 및 jsdom κ°€ λͺ¨λ‘ ν•„μš”ν•©λ‹ˆλ‹€. μŠ€νƒ 트레이슀 및 일뢀 디버깅은 window 에 μ˜ν•΄ 생성 된 jsdom window 에 μ„€μ •λ˜μ§€ μ•Šμ€ _global.Date μ•‘μ„ΈμŠ€λ₯Ό lolex μ‹œλ„ ν•  λ•Œ λ¬Έμ œκ°€ λ°œμƒ 함을 λ³΄μ—¬μ€λ‹ˆλ‹€.

@LouisBrunner μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ μ‹€ν–‰ κ°€λŠ₯ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λ§Œλ“€μ–΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ πŸ‘

μ €μž₯μ†Œμ—μ„œ test:node 둜 ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ˜ˆμƒλŒ€λ‘œ μ‹€νŒ¨ν•©λ‹ˆλ‹€.
mocha 만 μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ˜ˆμƒλŒ€λ‘œ ν†΅κ³Όν•©λ‹ˆλ‹€.

μ‹€νŒ¨ν•œ 쀄은 λΆ„μ„μœΌλ‘œ 끝낸 κ²ƒμ²˜λŸΌ lolex-src.js # L131 μž…λ‹ˆλ‹€.

당신이 결둠으둜, μ΄κ²ƒμ˜ κ·Όλ³Έ 원인이 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€ window μ˜ν•΄ μ œκ³΅λ˜λŠ” 객체 jsdom μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ Date 개체λ₯Ό. lolex κ°€ μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•˜λ €λ©΄ μ „μ—­ λ²”μœ„λ₯Ό μ°Έμ‘° ν•  수 μžˆμ–΄μ•Όν•˜λ―€λ‘œ 변경을 μˆ˜ν–‰ν•˜κ³  Date 직접 μ°Έμ‘° ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

lolex 은 JSDOM μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. lolex.withGlobal

// create a lolex implementation using node's `global`
const lolex = require("lolex").withGlobal(global);
const clock = lolex.install();

setTimeout(fn, 15); // Schedules with clock.setTimeout

clock.uninstall();

μ „μ—­ λ²”μœ„μ— λŒ€ν•œ 가정이 μΆ©μ‘±λ˜μ§€ μ•Šμ„ λ•Œ μ„€λͺ… 였λ₯˜κ°€ λ°œμƒν•˜λ„λ‘ lolex λ₯Ό ν™•μ‹€νžˆ κ°œμ„  ν•  수 있으며 μž‘μ„±μžκ°€ withGlobal μ‚¬μš©ν•˜λ„λ‘ μ œμ•ˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν’€ λ¦¬ν€˜μŠ€νŠΈμ— κΈ°μ—¬ ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

@mroderick 닀행이 μ˜ˆμ œκ°€ λ„μ›€μ΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€! πŸ˜ƒ

PR을 λ§Œλ“€ μˆ˜λŠ” μžˆμ§€λ§Œ lolex 만 μˆ˜μ •λ©λ‹ˆλ‹€. 이 μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ sinon.useFakeTimers λ₯Ό μ‚¬μš©ν•  μˆ˜μžˆλŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ? global 와 같은 인수λ₯Ό useFakeTimers 에 μΆ”κ°€ν•˜μ—¬ λ‚΄λΆ€μ μœΌλ‘œ withGlobal ν˜ΈμΆœν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

이 μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ μž‘λ™ν•˜λ„λ‘ sinon.useFakeTimers 에 λŒ€ν•œ μƒˆλ‘œμš΄ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? jsDomμ—μ„œ mochaλ₯Ό μ‚¬μš©ν•  λ•Œ μ—¬μ „νžˆμ΄ μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.

Error: The global scope doesn't have a `Date` object (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)

@LouisBrunner κ·Έ 아이디어가 λ§ˆμŒμ—

@mroderick μ €λŠ” sinon.useFakeTimers 톡해 κΈ€λ‘œλ²Œ μ»¨ν…μŠ€νŠΈλ₯Ό μ „λ‹¬ν•˜λŠ” 방법을 κ΅¬ν˜„ν•˜λŠ” PR (# 1935)을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. 이것이 μ—Όλ‘μ—λ‘κ³ μžˆλŠ” API의 μ’…λ₯˜μΈμ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. !

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

이것은 # 1935둜 μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” sinon 7.2.7 을 μ‚¬μš©ν•˜κ³  있으며 sinon.useFakeTimers() λ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œ λ‹€μŒκ³Ό 같은 κ²°κ³Όλ₯Ό μ–»μ—ˆμŠ΅λ‹ˆλ‹€.

TypeError: Cannot set property performance of #<Window> which has only a getter

λ˜‘κ°™λ‹€.
Babel 7이 될 수 μžˆμŠ΅λ‹ˆκΉŒ? https://github.com/babel/babel/issues/8363

@ cichy380 및 @axelhunn , 문제 λ³΄κ³ μ„œλ₯Ό κ²Œμ‹œν•˜μ‹­μ‹œμ˜€. 이 λ¬Έμ œλŠ” μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

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