web-dev-qa-db-ja.com

jestモック実装がrequire( '')で機能していません

1つの3番目のlibを使用してデータをフェッチする1つのJSをテストしたいので、その実装にjest mockを使用しています。テストで直接呼び出すと機能します。ただし、ソースコードで使用すると機能しません。

これがコードです

//Source implementation

var reference = require('./reference');

module.exports = {
  getResult: function() {
    return reference.result();
  }
};


//Test code

jest.dontMock('./foo');
jest.dontMock('console');

describe('descirbe', function() {
  var foo = require('./foo');

  it('should ', function() {
    var reference = require('./reference');

    reference.result.mockImplementation(function (a, b, c) {
      return '123'
    });

    console.log(foo.getResult()); // undefined
    console.log(reference.result()); // 123
  });

});
12
Xiaohe Dong

Requireの順序が間違っています。モックを設定する前に./fooが必要な場合、referenceは、Jestの自動モッキングに従ってfoos referenceが未定義になります。

jest.dontMock('./foo');                                                                                                                                                                                                                

describe('describe', function() {                                                                                                                                                                                                          
    it('should ', function () {                                                                                                                                                                                                            
        var reference = require('./reference');                                                                                                                                                                                               
        reference.result.mockImplementation(function (a, b, c) {
            return '123';
        });                                                                                                                                                                                               
        var foo = require('./foo');                                                                                                                                                                                                        

       console.log('ferr', foo.getResult());  // ferr 123                                                                                                                                                                                                
    });                                                                                                                                                                                                                                      
}); 
5

この線

var foo = require('./foo');

describeで評価され、fooに保存されます。

その後、itブロックでそれをモックアウトしますが、これは古い参照fooには適用されません。

foo呼び出しの後にmockImplementationを置くと、エラーが修正されます。

//Test code

jest.dontMock('./foo');
jest.dontMock('console');


describe('describe', function() {

  it('should ', function() {
    var reference = require('./reference');

    reference.result.mockImplementation(function (a, b, c) {
      return '123'
    });
    var foo = require('./foo');

    console.log(foo.getResult()); // undefined
    console.log(reference.result()); // 123
  });

});
5
CaptainCasey