如何使用Javascript覆盖获取?

如何使用Javascript覆盖获取?,javascript,reactjs,jestjs,Javascript,Reactjs,Jestjs,我想测试我的React应用程序并模拟后端调用。我决定用返回常量的Jest函数替换fetch 问题是我无法覆盖默认的获取值。我在谷歌上搜索了一堆,找到了global.fetch=…来覆盖fetch,但我不确定global是什么意思。我尝试在测试文件中编写var fetch=…,但没有成功,尽管组件在组件的范围内 我很高兴听到关于模仿取回的替代解决方案 // Does not work import component that fetches test(...){ var fetch = ..

我想测试我的React应用程序并模拟后端调用。我决定用返回常量的Jest函数替换fetch

问题是我无法覆盖默认的获取值。我在谷歌上搜索了一堆,找到了
global.fetch=…
来覆盖fetch,但我不确定global是什么意思。我尝试在测试文件中编写
var fetch=…
,但没有成功,尽管组件在组件的范围内

我很高兴听到关于模仿取回的替代解决方案

// Does not work
import component that fetches
test(...){
  var fetch = ...
  <component that fetches/>
}
//不起作用
导入获取的组件
测试(…){
var fetch=。。。
}
//有效
导入获取的组件
测试(…){
global.fetch=。。。
}

第一个选项可能不起作用,因为
fetch
变量是定义它的函数的局部变量。虽然组件在component语句的范围内没有多大意义,但组件是嵌套的(或者更具体地说,是React元素,因为
转换为
React.createElement(Comp)
)并不意味着它可以访问该范围内的任何内容,但作为道具专门传递的变量除外

其工作原理如下:

function foo() {
  var fetch = 'local';
  var someGlobal = 'local';
  console.log(fetch); // a global shadowed by a local
  console.log(someGlobal); // a global shadowed by a local
  bar(someGlobal);
}

function bar(someGlobal) {
  console.log(fetch); // a global
  console.log(someGlobal); // a global shadowed by a local
}
由于实际的请求不应该在测试中执行,因此可以通过将其分配给像
global.fetch=…
这样的全局对象来模拟
fetch
,但对于其他全局对象,这将不可能恢复原始实现。一般来说,开玩笑的间谍不应该被指派。取而代之的是,使用了
spyOn

beforeEach(() => {
  jest.spyOn(global, 'fetch').mockImplementation(...)
});

这允许框架在需要时恢复原始实现,这个间谍可以正确使用
resetAllMocks
restoreAllMocks

这对@shubhamsravastava有帮助吗?你知道全局是什么意思吗?我不是专家,但似乎全局是一个对象,而全局。fetch是为全局声明的函数,这意味着它在技术上不会覆盖以前的定义。我认为它是引用此global.fetch肯定会覆盖该提取。
beforeEach(() => {
  jest.spyOn(global, 'fetch').mockImplementation(...)
});