首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >仅用Jest来嘲弄单一的“窗口”属性

仅用Jest来嘲弄单一的“窗口”属性
EN

Stack Overflow用户
提问于 2020-12-19 15:00:51
回答 1查看 1.2K关注 0票数 0

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

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

代码语言:javascript
运行
复制
const mockWindow = { location: { href: 'https://stackoverflow.com/questions' } };
jest.spyOn(window, 'window', 'get').mockImplementation(() => mockWindow);

const wrapper = mount(<MyComponent />);

然而,当我运行它时,我会得到以下错误:

代码语言:javascript
运行
复制
TypeError: Right-hand side of 'instanceof' is not an object

    > |   const wrapper = mount(<MyComponent />);
      |                   ^

这告诉我在呈现/挂载组件时存在一个内部反应问题。这个问题是特别由我模拟window对象引起的。当我取消注释该行并重新运行它时,它不会引发此错误。

我猜想,内部反应会对window.*进行其他调用,而且由于我模拟了整个对象,这些调用由React返回undefined进行,并且组件不会呈现。

如何在保留其他属性不受影响的情况下,仅模拟window 的单个属性?

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

EN

回答 1

Stack Overflow用户

发布于 2020-12-19 16:27:32

而不是做jest.spyOn(窗口,‘窗口’.)尝试使用(全局的,“窗口”.)如下所示:

代码语言:javascript
运行
复制
const originalWindow = { ...window };
const windowSpy = jest.spyOn(global, "window", "get");
windowSpy.mockImplementation(() => ({
  ...originalWindow,
  location: {
    ...originalWindow.location,
    href: "http://my.test/page",
    replace: mockedReplace,
  },
}));

记得把它清理干净后:

代码语言:javascript
运行
复制
windowSpy.mockRestore();

您可以更好地跟踪这个例子

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65371139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档