Jest模拟实现与require('')无法正常工作

13

我想测试一个使用第三方库获取数据的JS,因此我正在使用jest模拟该实现。当我在测试中直接调用它时它是有效的。但是,当它在源代码中使用时却无效。

以下是代码

//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
  });

});
2个回答

5

您的要求顺序有误。当您在设置模拟reference之前先需要./foo时,根据Jest自动模拟,fooreference将为未定义。

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

mockImplementation 调用之后放置 foo 将修复错误。

//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
  });

});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接