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();
これを実現するのは、ジェストのあざける行動についてはどうですか?
正しいアサーションは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.
それでも問題が解決しない場合はお知らせください。
最も参考になるコメント
Jestは、
it
呼び出すたびにモジュールレジストリをリセットします。 あなたは必要とされているApiWrapper
上にし、Helper
beforeEach内なので、ヘルパーは、おそらくの別のコピーを受信ApiWrapper
。 それを修正するには、次のことができます。beforeEach
両方のクラスが必要簡単な説明:
それでも問題が解決しない場合はお知らせください。