繁体   English   中英

无法使用fetch-mock模拟节点获取

[英]Unable to mock node-fetch using fetch-mock

我正在尝试对一个简单的函数进行单元测试,该函数发送一个get请求,接收一个响应,然后返回带有成功或失败消息的promise对象。 以下是功能:

module.exports.hello = async (event, context) => {
  return new Promise((resolve, reject) => {
    fetch("https://httpstat.us/429", { headers: { 'Content-Type': 'application/json' } }).then(response => {
      console.log(response);
      if (response.status == 200) {
        return response;
      } else {
        throw Error(response.status + ": " + response.statusText);
      }
    }).then(tokenData => {
      resolve({ status: 200, body: JSON.stringify({ statusText: 'Success' }) });
    }).catch(error => {
      reject(error.message);
    });
  });
};

在进行单元测试时,我正在使用fetch-mock模拟对api的调用并具有自定义响应。 以下是代码:

it('hello returns failure message', (done) => {
    fetchMock.get('*',  {
        status: 429,
        statusText: "Too Many Nothings",
        headers: { 'Content-type': 'application/json' }
     });

    edx.hello(null, null).catch(error => {
        expect(error).to.equal('429: Too Many Requests');
    }).then(() => {
        done();
    }).catch(error => {
        done(error);
    });
});

但是此代码并未嘲笑提取请求,因为当我打印响应文本时,它是“太多请求”(由API作为响应发送),而不是“太多没什么”(正在被嘲笑)。 我是NodeJS的新手。 请告诉我我在做什么错。

如果您使用node-fetch包,则它在Node.js的全局范围内不可用。 为了使fetch-mock工作,您必须将fetch分配给global对象(例如,通过import "node-fetch";而不是import fetch from "node-fetch"; ),或者使fetch可注入您的测试方法。

http://www.wheresrhys.co.uk/fetch-mock/#usageglobal-non-global

全局或非全局

您的代码可以在全局或本地使用fetch。 确定哪个代码适用于您的代码库非常重要,因为这将影响您使用fetch-mock的方式

全局获取

在以下情况下,获取将是全局的

  • 在浏览器中使用本机提取(或polyfill)时
  • 在Node.js进程中将节点获取分配给全局时(同构代码库中有时使用的模式)

默认情况下,fetch-mock假定fetch是全局的,因此一旦需要fetch-mock,便无需进行其他设置。 非全局读取库

在以下情况下,获取不会是全局的

  • 在Node.js中使用node-fetch而不分配给global
  • 在浏览器中使用fetch-ponyfill
  • 使用内部使用fetch-ponyfill的库
  • 一些构建设置会导致非全局获取,尽管并非总是如此

sandbox()方法返回一个函数,可用作提取的直接替代。 将此传递到您选择的模拟库中。 sandbox()返回的函数具有所有公开的fetch-mock方法,例如

 const fetchMock = require('fetch-mock'); const myMock = fetchMock.sandbox().mock('/home', 200); // pass myMock in to your application code, instead of fetch, run it, then... expect(myMock.called('/home')).to.be.true; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM