[解決済み] Jestでグローバルをモックする
質問
Jestでグローバルオブジェクトをモックする方法はありますか?
navigator
のようなグローバルオブジェクトをモックする方法はありますか、あるいは
Image
*? 私はこれをかなりあきらめて、一連のモック可能なユーティリティ・メソッドに任せています。例えば
// Utils.js
export isOnline() {
return navigator.onLine;
}
この小さな関数をテストするのは簡単ですが、厄介で、全く決定論的ではありません。75%は実現できますが、これくらいが限界です。
// Utils.test.js
it('knows if it is online', () => {
const { isOnline } = require('path/to/Utils');
expect(() => isOnline()).not.toThrow();
expect(typeof isOnline()).toBe('boolean');
});
一方、このインダイレクトをよしとするならば、今度は
navigator
をこれらのユーティリティ経由でアクセスできるようになります。
// Foo.js
import { isOnline } from './Utils';
export default class Foo {
doSomethingOnline() {
if (!isOnline()) throw new Error('Not online');
/* More implementation */
}
}
...そして決定論的にはこのようにテストします...
// Foo.test.js
it('throws when offline', () => {
const Utils = require('../services/Utils');
Utils.isOnline = jest.fn(() => isOnline);
const Foo = require('../path/to/Foo').default;
let foo = new Foo();
// User is offline -- should fail
let isOnline = false;
expect(() => foo.doSomethingOnline()).toThrow();
// User is online -- should be okay
isOnline = true;
expect(() => foo.doSomethingOnline()).not.toThrow();
});
私が使ったすべてのテストフレームワークの中で、Jestは最も完全なソリューションのように感じますが、テスト可能にするために厄介なコードを書くときはいつでも、テストツールが私を失望させているように感じます。
これは唯一の解決策でしょうか、それともRewireを追加する必要があるのでしょうか?
*にやにやしないでください。
Image
はリモートのネットワークリソースに ping を打つのに最適です。
どのように解決するのですか?
すべての
テストスイート
はそれぞれ独自の環境を実行するので、グローバルを上書きすることでモックを作ることができます。すべてのグローバル変数にアクセスするには
global
の名前空間でアクセスできます。
global.navigator = {
onLine: true
}
上書きは現在のテストにのみ影響し、他のテストに影響を与えることはありません。また、これは
Math.random
あるいは
Date.now
.
の変更により jsdom の変更により、このようにグローバルをモックしなければならない可能性があることに注意してください。
Object.defineProperty(globalObject, key, { value, writable: true });
関連
-
[解決済み] Jestを使用して単一のテストを実行するにはどうすればよいですか?
-
[解決済み] Jestを使用して1つのファイルをテストするにはどうすればよいですか?
-
[解決済み] フェイク、モッキング、スタビングの違いとは?
-
[解決済み] モッキングとは?
-
[解決済み] Jestの'it'と'test'の違いは何ですか?
-
[解決済み] Mockitoで静的メソッドをモックする
-
[解決済み] Jestを使用してES6モジュールのインポートをモックするにはどうすればよいですか?
-
[解決済み】JestでESLintを使用する方法
-
[解決済み】Jestでスローされた例外の型をテストする方法
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Javascriptによるタッチスクリーンデバイスの検出
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] 兄弟ノードを選択する方法はありますか?
-
[解決済み] JSXとLoadshを使用して、ある要素をn回繰り返す方法
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
-
[解決済み] JavaScriptでjson-objectのキーを取得する [重複].
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]