Sinon: sinon.useFakeTimers()の場合、「TypeError:undefinedのプロパティ 'now'を読み取れません」

作成日 2018年07月05日  ·  15コメント  ·  ソース: sinonjs/sinon

バグを説明する
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

コンテキスト(次の情報を入力してください):

  • ライブラリバージョン:6.1.0
  • 環境:Ubuntu 16.04
  • URLの例:
  • 使用している他のライブラリ:

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

    • "チャイ": "^ 4.1.2"、

    • "vue-template-compiler": "^ 2.5.16"

    • モカ5.2.0

    • Webpack 4.15.1

Help wanted stale

最も参考になるコメント

@mroderickグローバルコンテキストをsinon.useFakeTimersに渡す方法を実装するPR(#1935)を作成しました。それがあなたが考えていた種類のAPIかどうかはわかりませんので、遠慮なくフィードバックをお

全てのコメント15件

[email protected]と同じ問題:がっかり:
[email protected]は期待どおりに機能します

奇妙な現象。 バニラAngularプロジェクトとSinon6.1.0を使用してこれを複製しようとしましたが、useFakeTimers()はエラーをスローしないため、プロジェクト環境自体に何かがある可能性があります。

エラーメッセージから、この変数はどういうわけか未定義になると思います。

@moraveyoこれを、問題を示す最小限の例に

Stack Overflowには、最小限の完全で検証可能な例を作成する方法に関するガイド

今は時間がないのでごめんなさい。

@mroderick今日この問題が発生しました。 これが問題を再現する小さなリポジトリです:ここ

バグを表示するには、 webpackjsdom両方が必要です。 スタックトレースといくつかのデバッグは、 lolexjsdomによって生成された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 、問題レポートを投稿してください。 この問題は修正されました。

このページは役に立ちましたか?
0 / 5 - 0 評価