Sinon: "TypeError: Tidak dapat membaca properti 'sekarang' dari tidak terdefinisi" ketika sinon.useFakeTimers ()

Dibuat pada 5 Jul 2018  ·  15Komentar  ·  Sumber: sinonjs/sinon

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!

Repo saya:
https://github.com/moraveyo/chess-clock/blob/bf764f3ed9026366de9375bbc870109e4f007099/tests/unit/Countdown.spec.js#L23

Konteks (lengkapi informasi berikut):

  • Versi Library: 6.1.0
  • Lingkungan: Ubuntu 16.04
  • Contoh URL:
  • Perpustakaan lain yang Anda gunakan:

    • "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"

    • Mocha 5.2.0

    • Webpack 4.15.1

Help wanted stale

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 !

Semua 15 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat