2016-08-19 14 views
2

私はReactのTestUtilsと一緒にkarmaとmochaを使ってReactアプリケーションをテストしています。私は、次の輸出と輸入にモジュールをテストしてるのコンポーネントの一つ:私のテストでkarma/mochaテストスイートでは、ウィンドウオブジェクトのプロパティをどのようにモックできますか?

export const OPTIONS = window.__OPTIONS__;

、私はカルマで仮想Chromeブラウザにコンポーネントをレンダリングしています。 「コンポーネント」参照のレンダリング機能に let tree = TestUtils.renderIntoDocument(<Component />);

OPTIONS.someOptionような何かをし、上記のテストを実行したとき、それが吹くとcannot read property 'someOption' of undefined.

を言う私は__OPTIONS__変数の「モック」試してみました:私は経由でこれをやっていますbefore()関数(テストを実行する前にその値を設定する)が、ログアウトして実際に設定されているのを見ても、コンポーネントモジュール内の値は未定義です。だから、webpackは実際に実行しているテストスクリプトの前にモジュールをバンドルしているので、常に定義されていないようです。

window.__OPTIONS__は、ページの上部に<script>window.__OPTIONS__ = {};</script>に含まれていて、コンポーネントモジュールの値で正しくインポートされているかのように値を設定する方法はありますか?

私はなぜ変数をウィンドウオブジェクトにアタッチしているのか分かりたくありません。なぜなら、私はこのケースでは避けられないものだからです。それはSalesforce固有の理由です。私がその変数を完全に使用することを避けることができたら、私はそうするでしょう。 beforeEach__OPTIONS__でグローバルにwindowオブジェクトを追加する

答えて

1

試してみてください。

beforeEach(function() { 
    global.window = { 
     __OPTIONS__: {} 
    }; 
}); 
0

私はglobalルートを試みたが、無駄に...ウィンドウがすでに常にカルマは、Chromeブラウザをスピンアップしているので定義されていました。さまざまな地域でのロギングをしゃべった後、私は操作の順序が1であることを確認しました。モジュールがバンドルされていました。2.テストスクリプトが実行されました。コンポーネントのimportステートメントの直下にログを追加してから、テストスクリプトの最初の行にログを追加しました。インポート後のログは、常に定義されていないものが最初に報告されました。

これを受けて、私はステップをバックアップし、filespreprocessors(webpack)のカルマ設定ファイルの両方にあるtests.webpack.jsを見ました。変数宣言をvar context = require.context('./src', true, /-test\.jsx?$/);context.keys().forEach(context);の行に追加しました。

関連する問題