JavaScript
jest

JESTでグローバル関数を無理やりmock化する

More than 1 year has passed since last update.

もっといい方法がありそうだが、実現できましたので記録に残します。

やりたいこと

JESTにおいて、あるグローバル関数の処理は行わずに引数を渡し、期待する返り値を得る
テストしたいcodeAで、グローバルとして定義されているhogefuncを扱いたい。
※ダミーでコード載せているので動かないかもしれません

codeA.js
var abc = hogefunc;

function codeA(){
 return abc.foo('aiu','eo');
}

module.exports = codeA;

やったこと

1. package.jsonのjest.globalプロパティにグローバル化したい変数を追加。

以下の場合は、hogefuncをグローバル関数にしたい。

package.json
{
"jest":{
     "globals": {
        "hogefunc":""
      }
}

2. testコードでglobal値を上書きする

hoge.test.js
require('./codeA.js');

hogefunc = function(){};

function foo(str1,str2){
    return str1 + str2;
}

function bar(str1,str2){
    return str2 + str1;
}

hogefunc.foo = foo;
hogefunc.bar = bar;

test('mock test' , () =>{
    expect(hogefunc.foo('aiu','eo')).toBe('aiueo');
    expect(hogefunc.bar('abc','de')).toBe('deabc');
});

test('codeA test' , () =>{
    var a = new codeA();
    expect(a).toBe('aiueo');
});

本当は・・・

Manual Mocksを使えばできたかもしれないが、うまく扱うことができなかった。
この辺は課題としてJESTといい関係を続けたいです。
便利だがまだまだ使いこなせていない実感。