Jest: 静的クラスメソッドのモック

作成日 2016年07月05日  ·  3コメント  ·  ソース: facebook/jest

Jestで静的クラスメソッドをモックしようとすると問題が発生しました。 この動作はサポートされていますか?

http://stackoverflow.com/questions/38206478/mocking-methods-in-jestにクロスポスト

私は次のような非常に単純な単体テストを持っています:

import ApiWrapper from '../../services/api_wrapper';
jest.unmock('../helper')

describe('Helper', () => {
    let Helper;

    beforeEach(() => {
        Helper = require('../helper').default;
    });

    it('calls the Api Wrapper', () => {
        Helper.help()

        expect(ApiWrapper.help).toHaveBeenCalled();
    });

});

ヘルパーは次のようになります。

import ApiWrapper from '../services/api_wrapper'
class Helper {
    help() {
        ApiWrapper.help()
    }
}

export default new Helper();

そして、ApiWrapperは次のようになります。

class ApiWrapper {
  static help () {
     console.log('help!')
  }
}
export default ApiWrapper;

ApiWrapper.help()はJestに嘲笑されるので、「助けて!」 印刷されることはありませんが、テストの期待値は失敗します。 ApiWrapperを次のような単純なJavascriptオブジェクトに書き直しても、これは失敗します。

export default {
    help: () => { console.log('help!'); }
}

ただし、仕様のインポートを変更して(ApiWrapperがbeforeEachにインポートされるように)、次のようにApiWrapperをシングルトンクラスに書き換えると機能します。

class ApiWrapper {
   help() {
      console.log('help!');
   }
}();

export default new ApiWrapper();

これを実現するのは、ジェストのあざける行動についてはどうですか?

最も参考になるコメント

Jestは、 it呼び出すたびにモジュールレジストリをリセットします。 あなたは必要とされているApiWrapper上にし、 Helper beforeEach内なので、ヘルパーは、おそらくの別のコピーを受信ApiWrapper 。 それを修正するには、次のことができます。

  • 両方のクラスを一番上にインポートします。
  • beforeEach両方のクラスが必要

簡単な説明:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

それでも問題が解決しない場合はお知らせください。

全てのコメント3件

正しいアサーションはtoBeCalled必要があります。 あなたはそれを試すことができますか?

申し訳ありませんが、それは私が意味したことです。 Stackoverflowに例を直接入力しました。

Jestは、 it呼び出すたびにモジュールレジストリをリセットします。 あなたは必要とされているApiWrapper上にし、 Helper beforeEach内なので、ヘルパーは、おそらくの別のコピーを受信ApiWrapper 。 それを修正するには、次のことができます。

  • 両方のクラスを一番上にインポートします。
  • beforeEach両方のクラスが必要

簡単な説明:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

それでも問題が解決しない場合はお知らせください。

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