如何使用 Jest 和 Proxyquire 存根模块?

Posted

技术标签:

【中文标题】如何使用 Jest 和 Proxyquire 存根模块?【英文标题】:How do I stub a module with Jest and Proxyquire? 【发布时间】:2018-12-15 13:21:24 【问题描述】:

我想强制 node-fetch 成为存根,但我遇到了一些麻烦 让它工作。代码:

const fetchMock = jest.fn();

const 
  getArticle 
 = require('../../sfpublish/api');
console.log('loaded api')
const A = global.proxyquire('../../sfpublish/api', 
  'node-fetch': fetchMock
);

setup.js

global.proxyquire = require('proxyquire');

package.json

"jest": 
    "automock": false,
    "globalSetup": "./test/__config.js",
    "setupFiles": [
      "./test/__setup.js"
    ]
  ,

结果:

FAIL  test/sfpublish/api.test.js
  ● Test suite failed to run

    Cannot find module '../../sfpublish/api'

      23 |  = require('../../sfpublish/api');
      24 | console.log('loaded api')
    > 25 | const A = global.proxyquire('../../sfpublish/api', 
         |                  ^
      26 |   'node-fetch': fetchMock
      27 | );

怎么会无法加载我之前加载 2 行的模块? proxyquire 不是在这里使用的正确模块吗?

我已经让node-fetch 在我的测试中成为一个模拟,但是当我在模块(顶部有const fetch = require('node-fetch');)中运行该函数时,它会进入真正的模块而不是假模块。我试过使用像fetch-mock 这样的获取模拟库但无济于事。

【问题讨论】:

好像不行。请参阅此 github 评论 - github.com/facebook/jest/issues/1937#issuecomment-346531494 【参考方案1】:

我最后放了一个模拟:

test/__mocks__/node-fetch.js

'use strict';
const nodeFetch = jest.genMockFromModule('node-fetch');
module.exports = nodeFetch;

package.json:

 "jest": 
    "verbose": true,
    "automock": false,
    "globalSetup": "./test/__config.js",
    "coverageReporters": [
      "text-summary",
      "html"
    ],
    "roots": [
      "./test"
    ],
    "setupFiles": [
      "./test/__setup.js"
    ]
  

【讨论】:

以上是关于如何使用 Jest 和 Proxyquire 存根模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jest 在 TypeORM 中存根 EntityManager 和 Connection

React Native Jest - 如何使用多个钩子测试功能组件?无法存根 AccessiblityInfo 模块

TypeError:AWS.SecretsManager 不是使用 proxyquire 进行单元测试的构造函数

用 Jest 模拟基于承诺的请求

使用proxyquire和mocha在单元测试中模拟方法调用时如何模拟时间延迟(超时)?

如何使用 sinon 存根/模拟从“超类”复制的依赖项方法