バグを説明する
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にダウングレードすると、すべて問題ありません。
コンテキスト(次の情報を入力してください):
[email protected]
と同じ問題:がっかり:
[email protected]
は期待どおりに機能します
奇妙な現象。 バニラAngularプロジェクトとSinon6.1.0を使用してこれを複製しようとしましたが、useFakeTimers()はエラーをスローしないため、プロジェクト環境自体に何かがある可能性があります。
エラーメッセージから、この変数はどういうわけか未定義になると思います。
@moraveyoこれを、問題を示す最小限の例に
Stack Overflowには、最小限の完全で検証可能な例を作成する方法に関するガイド
今は時間がないのでごめんなさい。
@mroderick今日この問題が発生しました。 これが問題を再現する小さなリポジトリです:ここ。
バグを表示するには、 webpack
とjsdom
両方が必要です。 スタックトレースといくつかのデバッグは、 lolex
がjsdom
によって生成されたwindow
設定されていないように見える_global.Date
にアクセスしようとしたときに問題が発生することを示しています。
@LouisBrunnerは、理解しやすい実行可能なテストケースを作成して
リポジトリにtest:node
してテストを実行すると、期待どおりに失敗します。
mocha
だけを使用してテストを実行すると、期待どおりに合格します。
分析で結論付けたように、失敗する行はlolex-src.js#L131です。
結論として、これの根本的な原因は、 jsdom
によって提供されるwindow
オブジェクトが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で修正されました
私はsinon7.2.7を使用していますが、 sinon.useFakeTimers()
を使用しようとすると、次のようになります。
TypeError: Cannot set property performance of #<Window> which has only a getter
同じ。
バベル7でしょうか? https://github.com/babel/babel/issues/8363
@ cichy380と@axelhunn 、問題レポートを投稿してください。 この問題は修正されました。
最も参考になるコメント
@mroderickグローバルコンテキストを
sinon.useFakeTimers
に渡す方法を実装するPR(#1935)を作成しました。それがあなたが考えていた種類のAPIかどうかはわかりませんので、遠慮なくフィードバックをお