javascript - 用 Jest 只模拟一个“window”属性
问题描述
我有一个调用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 />);
但是,当我运行它时,我收到以下错误:
TypeError: Right-hand side of 'instanceof' is not an object
> | const wrapper = mount(<MyComponent />);
| ^
这告诉我在渲染/安装组件时存在内部 React 问题。这个问题是由我模拟window
对象引起的。当我取消注释该行并重新运行它时,它不会引发此错误。
我猜测React 在内部会进行其他调用,window.*
并且因为我模拟了整个对象,所以 React 进行的那些调用返回undefined
并且组件不会呈现。
我如何只模拟一个属性window
而保持其他属性不变?
或者,还有其他原因会出错吗?还是有其他巧妙的方法来解决这个问题?
解决方案
而不是 jest.spyOn(window, 'window'...) 尝试使用 (global, '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();
您可以按照此示例更好地检查
推荐阅读
- ruby-on-rails - 如何通过rails控制台上的模型获取通讯员ID
- php - 返回页面时显示已经存在的“财富”
- asp.net-core - 使用 SignalR 在 ASP .NET CORE 中自定义实现类似按钮
- angular - 如何在 Visual Studio 2019 中从在线模板创建项目
- mysql - MariaDB 涉及服务器版本的语法错误
- docker - 我无法在 GCP Compute Engine 上访问我的 Docker 容器
- mysql - TCPConnectWrap.afterConnect - 节点在 docker compose 中时无法从 mysql 获取数据
- ios - 通过 Mac 终端在 iOS 设备文件上安装我的 .app 发布文件
- r - R ggplot自定义标签轴与其他变量打勾
- powerquery - 如何根据条件累积列