λ²κ·Έ μ€λͺ
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
컨ν μ€νΈ (λ€μ μ 보λ₯Ό μμ±νμμμ€) :
[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 , λ¬Έμ λ³΄κ³ μλ₯Ό κ²μνμμμ€. μ΄ λ¬Έμ λ μμ λμμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
@mroderick μ λ
sinon.useFakeTimers
ν΅ν΄ κΈλ‘λ² μ»¨ν μ€νΈλ₯Ό μ λ¬νλ λ°©λ²μ ꡬννλ PR (# 1935)μ λ§λ€μμ΅λλ€. μ΄κ²μ΄ μΌλμλκ³ μλ APIμ μ’ λ₯μΈμ§ λͺ¨λ₯΄κ² μ΅λλ€. !