Jelaskan bugnya
Menggunakan sinon @ sinon.useFakeTimers()
- Saya mendapat kesalahan:
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)
Ketika saya menurunkan versi ke sinon @ 5 - semuanya baik-baik saja!
Konteks (lengkapi informasi berikut):
Masalah yang sama dengan [email protected]
: kecewa:
[email protected]
berfungsi seperti yang diharapkan
Fenomena aneh. Saya telah mencoba mereplikasi ini menggunakan proyek Vanilla Angular dan Sinon 6.1.0, tetapi useFakeTimers () tidak menimbulkan kesalahan apa pun untuk saya, jadi mungkin ada sesuatu di lingkungan proyek itu sendiri.
Dari pesan kesalahan, tebakan saya adalah variabel ini entah bagaimana menjadi tidak terdefinisi.
@moraveyo, apakah Anda dapat
Stack Overflow memiliki panduan tentang Cara membuat contoh Minimal, Lengkap, dan Dapat Diverifikasi
Saya tidak punya banyak waktu untuk itu sekarang, maaf.
@mroderick Saya baru saja mengalami masalah ini hari ini. Ini adalah repositori kecil yang mereplikasi masalah: di sini .
Bug membutuhkan webpack
dan jsdom
untuk muncul. Stacktrace dan beberapa debugging menunjukkan masalah muncul ketika lolex
mencoba mengakses _global.Date
yang tampaknya tidak diatur pada window
dihasilkan oleh jsdom
.
@LouisBrunner terima kasih telah membuat kasus uji yang dapat dijalankan yang mudah dipahami 👍
Menjalankan pengujian dengan test:node
di repositori Anda, gagal seperti yang diharapkan.
Ketika saya menjalankan pengujian dengan hanya menggunakan mocha
, pengujian berjalan seperti yang diharapkan.
Baris yang gagal adalah lolex-src.js # L131 , seperti yang Anda simpulkan dengan analisis Anda.
Saat Anda menyimpulkan, akar penyebabnya adalah objek window
disediakan oleh jsdom
tidak menyediakan objek Date
. lolex
harus bisa mereferensikan cakupan global agar bisa berfungsi dengan benar, jadi kita tidak bisa membuat perubahan dan mereferensikan Date
secara langsung.
lolex
memiliki dukungan untuk skenario JSDOM, lihat 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();
Kita tentunya dapat meningkatkan lolex
untuk memunculkan kesalahan deskriptif ketika asumsinya tentang cakupan global tidak terpenuhi, dan menyarankan agar penulis menggunakan withGlobal
. Apakah Anda ingin berkontribusi pull request untuk itu?
@mroderick Senang contoh membantu! 😃
Saya dengan senang hati membuat PR, namun itu hanya akan menghasilkan lolex
. Adakah cara untuk mendapatkan sinon.useFakeTimers
untuk bekerja dalam skenario ini? Mungkin dengan menambahkan argumen seperti global
ke useFakeTimers
yang dapat digunakan untuk memanggil withGlobal
internal?
Apakah ada pembaruan baru tentang mendapatkan sinon.useFakeTimers
untuk bekerja dalam skenario ini. Saya masih mendapatkan pengecualian ini saat menggunakan moka di jsDom
Error: The global scope doesn't have a `Date` object (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)
@LouisBrunner Saya suka ide itu, saya pikir solusi itu akan berhasil untuk kebanyakan orang 👍
@mroderick Saya membuat PR (# 1935) yang menerapkan cara untuk meneruskan konteks global melalui sinon.useFakeTimers
, saya tidak tahu apakah itu jenis API yang Anda pikirkan, jadi silakan berikan umpan balik apa pun !
Masalah ini secara otomatis ditandai sebagai usang karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut. Terima kasih atas kontribusi Anda.
Ini telah diperbaiki dengan # 1935
Saya menggunakan sinon 7.2.7 dan ketika saya mencoba menggunakan sinon.useFakeTimers()
saya mendapat:
TypeError: Cannot set property performance of #<Window> which has only a getter
Sama.
Mungkinkah Babel 7? https://github.com/babel/babel/issues/8363
@ cichy380 dan @axelhunn , silakan posting laporan masalah. Masalah ini sudah diperbaiki.
Komentar yang paling membantu
@mroderick Saya membuat PR (# 1935) yang menerapkan cara untuk meneruskan konteks global melalui
sinon.useFakeTimers
, saya tidak tahu apakah itu jenis API yang Anda pikirkan, jadi silakan berikan umpan balik apa pun !