如何使用Javascript覆盖获取?
我想测试我的React应用程序并模拟后端调用。我决定用返回常量的Jest函数替换fetch 问题是我无法覆盖默认的获取值。我在谷歌上搜索了一堆,找到了如何使用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 = ..
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(...)
});