jest模拟实现不能使用require('')

Xia*_*ong 11 javascript jestjs

我想测试一个使用一个第三个lib来获取数据的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
  });

});
Run Code Online (Sandbox Code Playgroud)

Hen*_*son 5

您的要求顺序是错误的。当你需要./foo设置你的模拟前,reference然后foo小号reference将不确定按玩笑automocking。

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                                                                                                                                                                                                
    });                                                                                                                                                                                                                                      
}); 
Run Code Online (Sandbox Code Playgroud)


Cap*_*sey 5

线

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

在中进行评估describe并存储在中foo

然后,在该代码it块中,您要对此进行模拟,但这不适用于旧的reference foo

foomockImplementation调用将修复错误。

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

});
Run Code Online (Sandbox Code Playgroud)