Sinon: mematikan setSegera secara default mengarah ke perilaku yang tidak diinginkan

Dibuat pada 7 Jan 2016  ·  4Komentar  ·  Sumber: sinonjs/sinon

Saya perhatikan ini ketika mencoba mencari tahu mengapa mematikan waktu sistem menyebabkan penulisan csv gagal. Ternyata perpustakaan memiliki panggilan setImmediate yang memblokir: https://github.com/C2FO/fast-csv/blob/master/lib/extended.js#L18

Sepertinya ada banyak perpustakaan yang mengandalkan setImmediate untuk hal-hal yang tidak berbahaya, dan memalsukan setImmediate menyebabkan perilaku yang tidak terduga di semuanya:

Mungkin tidak masuk akal untuk mengharapkan bahwa mematikan waktu sistem tidak menyebabkan penulisan csv gagal? Dalam hal ini, sangat sulit untuk melacaknya, karena dalam Javascript Anda tidak bisa hanya menekan ctrl+c dan mendapatkan pelacakan tumpukan yang menunjukkan kepada Anda apa yang salah. Butuh sekitar 90 menit hanya untuk mengidentifikasi bagian mana dari kode yang membeku, dan kemudian untuk memahami mengapa sinon bertanggung jawab.

Saya tidak yakin apa yang harus diperbaiki, tetapi tampaknya memengaruhi banyak perpustakaan, dan setidaknya salah satu dari mereka merespons dengan membuat versi setImmediate sendiri yang tidak dapat diubah.

Jika jawabannya adalah saya harus menelepon useFakeTimers(0, "Date") , mungkin itu yang harus default? Mungkin itu lebih sesuai dengan harapan saya/orang-orang tentang bagaimana dunia berperilaku?

Komentar yang paling membantu

Untuk referensi di masa mendatang, bentuk fungsi ini sekarang memungkinkan Anda menentukan fungsi mana yang dipalsukan:

var clock = sinon.useFakeTimers([now, ]prop1, prop2, ...);

Sets the clock start timestamp and names functions to fake.

Possible functions are setTimeout, clearTimeout, setInterval, clearInterval, setImmediate, clearImmediate and Date. Can also be called without the timestamp.

Jadi ini memecahkan masalah bagi saya ketika bekerja dengan express:

clock = sinon.useFakeTimers(1495020000, 'Date');

Semua 4 komentar

Saya tidak yakin apa yang harus diperbaiki, tetapi tampaknya memengaruhi banyak perpustakaan, dan setidaknya salah satu dari mereka merespons dengan membuat versi setImmediate sendiri yang tidak dapat dihancurkan.

Itu adalah solusi yang disarankan ketika Anda menggunakan setTimeout, setImmediate untuk efek mendapatkan tumpukan panggilan baru (dan bukan untuk mengontrol waktu).

https://github.com/taylorhakes/promise-polyfill/pull/15

Ya, saya hanya menghabiskan 90 menit untuk mendiagnosis dan memperbaiki ini dalam basis kode komersial.

Paling tidak, dokumen harus menyebutkan bahwa setImmediate akan dipalsukan.

Untuk referensi di masa mendatang, bentuk fungsi ini sekarang memungkinkan Anda menentukan fungsi mana yang dipalsukan:

var clock = sinon.useFakeTimers([now, ]prop1, prop2, ...);

Sets the clock start timestamp and names functions to fake.

Possible functions are setTimeout, clearTimeout, setInterval, clearInterval, setImmediate, clearImmediate and Date. Can also be called without the timestamp.

Jadi ini memecahkan masalah bagi saya ketika bekerja dengan express:

clock = sinon.useFakeTimers(1495020000, 'Date');

Dokumentasi menjelaskan ini sekarang: http://sinonjs.org/releases/v2.3.2/fake-timers/#var -clock--sinonusefaketimersnow-prop1-prop2-

Apakah halaman ini membantu?
0 / 5 - 0 peringkat