Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用笑话只模仿一个'window'属性_Javascript_Jestjs_Mocking_Window_Enzyme - Fatal编程技术网

Javascript 用笑话只模仿一个'window'属性

Javascript 用笑话只模仿一个'window'属性,javascript,jestjs,mocking,window,enzyme,Javascript,Jestjs,Mocking,Window,Enzyme,我有一个React组件,它调用window.location.href 作为Jest测试的一部分,我模拟window.location.href的值,如下所示: const mockWindow = { location: { href: 'https://stackoverflow.com/questions' } }; jest.spyOn(window, 'window', 'get').mockImplementation(() => mockWindow); const wra

我有一个React组件,它调用
window.location.href

作为Jest测试的一部分,我模拟
window.location.href
的值,如下所示:

const mockWindow = { location: { href: 'https://stackoverflow.com/questions' } };
jest.spyOn(window, 'window', 'get').mockImplementation(() => mockWindow);

const wrapper = mount(<MyComponent />);
const mockWindow={location:{href:'https://stackoverflow.com/questions' } };
spyOn(window,'window','get').mockImplementation(()=>mockWindow);
const wrapper=mount();
但是,当我运行它时,会出现以下错误:

TypeError: Right-hand side of 'instanceof' is not an object

    > |   const wrapper = mount(<MyComponent />);
      |                   ^
TypeError:“instanceof”的右侧不是对象
>| const wrapper=mount();
|                   ^
这说明呈现/装载组件时存在内部React问题。这个问题是由我模拟
窗口
对象引起的。当我取消注释该行并重新运行它时,它不会引发此错误

我猜React会在内部对
窗口进行其他调用。*
,因为我模拟了整个对象,所以React进行的那些调用返回
未定义的
,组件不会呈现

如何仅模拟
窗口的单个属性,而不影响其他属性?


或者,是否有其他原因导致此错误?或者有其他聪明的方法来解决这个问题吗?

不要开玩笑。spyOn(窗口,'window'…)尝试使用(全局,'window'…)如下所示:

const originalWindow = { ...window };
const windowSpy = jest.spyOn(global, "window", "get");
windowSpy.mockImplementation(() => ({
  ...originalWindow,
  location: {
    ...originalWindow.location,
    href: "http://my.test/page",
    replace: mockedReplace,
  },
}));
在记住清理之后:

windowSpy.mockRestore();

您可以更好地查看以下内容

我不明白您为什么在jest DOM环境中使用jest.spyOn(window,'window,'get')
全局===window
,因此它不会向原始代码段添加任何内容,
…window
会破坏某些内容,因为它会丢弃某些属性。@EstusFlask-您是对的。我深入研究了我的错误,它是由
window.htmliframelement
beinig
undefined
引起的。上面的间谍方法很聪明,但是
{…window}
仍然没有复制
htmliframelement
属性(whcih是
函数()
),因此错误仍然存在。