[解決済み] Jestでモックされたサービスが「jest.mock()のモジュールファクトリは、スコープ外の変数を参照することを許可されていません」エラーを発生させる
質問
あるサービスの呼び出しをモック化しようとしているのですが、以下のようなメッセージが表示され、困っています。
のモジュールファクトリは
jest.mock()
のモジュール・ファクトリは、スコープ外の変数を参照することが許可されていません。
.
ES6構文、jest、enzymeでbabelを使っています。
というシンプルなコンポーネントを持っています。
Vocabulary
のリストを取得します。
VocabularyEntry
-オブジェクトのリストを取得します。
vocabularyService
を生成し、それをレンダリングする。
import React from 'react';
import vocabularyService from '../services/vocabularyService';
export default class Vocabulary extends React.Component {
render() {
let rows = vocabularyService.vocabulary.map((v, i) => <tr key={i}>
<td>{v.src}</td>
<td>{v.target}</td>
</tr>
);
// render rows
}
}
は
vocabularyServise
は非常にシンプルです。
import {VocabularyEntry} from '../model/VocabularyEntry';
class VocabularyService {
constructor() {
this.vocabulary = [new VocabularyEntry("a", "b")];
}
}
export default new VocabularyService();`
今度は
vocabularyService
をモック化したいと思います。
import {shallow} from 'enzyme';
import React from 'react';
import Vocabulary from "../../../src/components/Vocabulary ";
import {VocabularyEntry} from '../../../src/model/VocabularyEntry'
jest.mock('../../../src/services/vocabularyService', () => ({
vocabulary: [new VocabularyEntry("a", "a1")]
}));
describe("Vocabulary tests", () => {
test("renders the vocabulary", () => {
let $component = shallow(<Vocabulary/>);
// expect something
});
});
テストを実行すると、エラーが発生します。Vocabulary.spec.js: babel-plugin-jest-hoist.Vocabulary.spec.js: babel-plugin-jest-hoist: のモジュールファクトリは
jest.mock()
のモジュールファクトリは、スコープ外の変数を参照することが許可されていません。
無効な変数アクセスです。VocabularyEntryです。
私が理解した限りでは、VocabularyEntryは宣言されていないため(jestはモックの定義をファイルの先頭に移動するため)、使用できません。
どなたか、これを修正する方法を説明していただけませんか。私はモック呼び出しの内側に参照を必要とするソリューションを見たが、私はクラスファイルでこれを行うことができる方法を理解していない。
どのように解決するのですか?
問題は、すべての
jest.mock
はコンパイル時に実際のコードブロックの一番上に持ち上げられるということです。この時点では
VocabularyEntry
はインポートされません。を置くか、あるいは
mock
の中に
beforeAll
ブロックに入れるか、あるいは
jest.mock
のようにします。
import {shallow} from 'enzyme';
import React from 'react';
import Vocabulary from "../../../src/components/Vocabulary ";
import {VocabularyEntry} from '../../../src/model/VocabularyEntry'
import vocabularyService from '../../../src/services/vocabularyService'
jest.mock('../../../src/services/vocabularyService', () => jest.fn())
vocabularyService.mockImplementation(() => ({
vocabulary: [new VocabularyEntry("a", "a1")]
}))
これはまず単純なスパイでモジュールをモックし、すべてのものがインポートされた後にモックの本当の実装を設定します。
関連
-
[解決済み】Javaプロジェクト。ApplicationContextのロードに失敗しました
-
[解決済み】Assert.Fail()はバッドプラクティスとみなされるか?
-
[解決済み] mockitoのwhen()呼び出しはどのように動作するのですか?
-
[解決済み] MOCKITOとは何か、Junitとはどう違うか
-
[解決済み] ユニットテストの妥当なコードカバレッジは何%ですか(とその理由)?[クローズド]です。
-
[解決済み】Unit Testsの一般的な命名規則にはどのようなものがありますか?[クローズド]。
-
[解決済み] Spring Dataのリポジトリをテストするには?
-
[解決済み] ファイルシステムに依存するコードの単体テスト
-
[解決済み] Go の testing パッケージを使用してテストのセットアップを行うにはどうすればよいですか?
-
[解決済み] QUnitとJasmineの比較?[クローズド]
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ユニットテスト、インテグレーションテスト、スモークテスト、リグレッションテストとは何ですか?終了
-
[解決済み] Goのモック関数
-
[解決済み] Unit Testsでランダムデータ?
-
[解決済み] 抽象クラスのテスト
-
[解決済み] "エラー。Karma-Jasmineのユニットテストケースを書いているときに「No provider for router」というエラーが発生しました。
-
[解決済み] Junit: 統合テストと単体テストの分割
-
[解決済み] QUnitとJasmineの比較?[クローズド]
-
[解決済み] ReSharperのエラー。「出力が限界に達したため、切り捨てられました。完全な出力を見るには 'スタックトレースを新しいウィンドウで表示' アクションを使用してください".
-
[解決済み] ユニットテストはどれだけ深いか?
-
[解決済み] maven :: 複数モジュールのプロジェクトで単一のテストだけを実行する