如何让jest忽略相当常见的`debug`节点包?

gma*_*man 6 jestjs

我有一个看起来像这样的节点js模块

"use strict";

var debug = require('debug')('foo');

var Foo = function() {
  this.x = 123;
  debug("init");
};

module.exports = Foo;
Run Code Online (Sandbox Code Playgroud)

我的测试看起来像这样

jest.dontMock('../lib/foo');
jest.dontMock('debug');

describe('footest', function() {
 it('checks the foo', function() {
   var Foo = require('../lib/foo');
   var foo = new Foo();
   expect(foo.x).toBe(123);
 });
});
Run Code Online (Sandbox Code Playgroud)

但是当我开玩笑的时候

node node_modules/jest-cli/bin/jest.js 
Run Code Online (Sandbox Code Playgroud)

我明白了

Found 1 matching tests...
 FAIL  __tests__/foo-test.js (0.02s)
? footest › it checks the foo
  - TypeError: /Users/gregg/src/jest-test/lib/foo.js: /Users/gregg/src/jest-test/node_modules/debug/node.js: Cannot read property 'buffer' of undefined
      at Socket.self [as bytesWritten] (net.js:688:8)
      at _getMetadata (/Users/gregg/src/jest-test/node_modules/jest-cli/src/lib/moduleMocker.js:279:49)
      at _getMetadata (/Users/gregg/src/jest-test/node_modules/jest-cli/src/lib/moduleMocker.js:286:23)
      at _getMetadata (/Users/gregg/src/jest-test/node_modules/jest-cli/src/lib/moduleMocker.js:279:27)
      at _getMetadata (/Users/gregg/src/jest-test/node_modules/jest-cli/src/lib/moduleMocker.js:279:27)
      at Object.module.exports.getMetadata (/Users/gregg/src/jest-test/node_modules/jest-cli/src/lib/moduleMocker.js:388:20)
      at Loader._generateMock (/Users/gregg/src/jest-test/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:280:56)
      at Loader.requireMock (/Users/gregg/src/jest-test/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:782:43)
      at Loader.requireModuleOrMock (/Users/gregg/src/jest-test/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:897:17)
      at /Users/gregg/src/jest-test/node_modules/debug/node.js:6:11
      at Object.runContentWithLocalBindings (/Users/gregg/src/jest-test/node_modules/jest-cli/src/lib/utils.js:309:17)
      at Loader._execModule (/Users/gregg/src/jest-test/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:243:9)
      at Loader.requireModule (/Users/gregg/src/jest-test/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:879:10)
      at Loader.requireModuleOrMock (/Users/gregg/src/jest-test/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:899:17)
      at /Users/gregg/src/jest-test/lib/foo.js:3:13
      at Object.runContentWithLocalBindings (/Users/gregg/src/jest-test/node_modules/jest-cli/src/lib/utils.js:309:17)
      at Loader._execModule (/Users/gregg/src/jest-test/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:243:9)
      at Loader.requireModule (/Users/gregg/src/jest-test/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:879:10)
      at Loader.requireModuleOrMock (/Users/gregg/src/jest-test/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:899:17)
      at Spec.<anonymous> (/Users/gregg/src/jest-test/__tests__/foo-test.js:7:14)
      at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
Run Code Online (Sandbox Code Playgroud)

我怎么开玩笑地忽略调试包,为什么当我告诉它不要时它似乎正在制作模拟?

Vov*_*cev 1

发生这种情况的原因是因为jest.dontMock('debug');只会阻止模拟调试模块的根文件,而所有其他内部仍然会被模拟。

一种可能的解决方案是使用配置选项防止模拟调试库unmockedModulePathPatterns

在 package.json 中:
{
  "name": "...",
  "version": "0.0.0",
  ...
  "jest": {
    "unmockedModulePathPatterns": ["/node_modules/debug"]
  },
}
Run Code Online (Sandbox Code Playgroud)

  • 我有同样的问题,但这些解决方案对我没有帮助:/ (2认同)