代码之家  ›  专栏  ›  技术社区  ›  jcollum

如何使用jest和proxyquire来存根模块?

  •  1
  • jcollum  · 技术社区  · 7 年前

    我想强迫 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 | });
    

    它怎么可能无法加载我刚才加载了两行的模块?是 proxyquire 不是在这里使用的正确模块?

    我得到了 节点获取 在我的测试中是一个模拟,但是当我在模块中运行函数时 const fetch = require('node-fetch'); 在顶部)它将转到真正的模块而不是假的。我试过用fetch嘲笑libs fetch-mock 无济于事。

    1 回复  |  直到 7 年前
        1
  •  0
  •   jcollum    7 年前

    最后我做了个模拟:

    测试/模拟/节点获取.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"
        ]
      }
    
    推荐文章