Javascript 用笑话只模仿一个'window'属性
我有一个React组件,它调用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
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
beinigundefined
引起的。上面的间谍方法很聪明,但是{…window}
仍然没有复制htmliframelement
属性(whcih是函数()
),因此错误仍然存在。