javascript - 测试窗口位置是否设置正确
问题描述
我在我的useEffect
钩子中设置窗口位置如下。
const MyComponent = (name) => {
React.useEffect(() => {
window.location.href = `/${name}/mypath${window.location.search}`
}, []);
return <Fragment/>;
};
我正在寻找测试该href
值是否正确匹配。
因此,我按如下方式模拟数据并期望该值与以下字符串匹配。
www.test.com/name/mypath?param=1
但我最终得到错误,说 window.location.href 的值实际上如下。
/[object Object]/mypath?param=1
它缺少主机,也没有在 href 中捕获名称 prop 的值。我能得到一些关于我做错了什么的建议吗?谢谢。
我的测试如下。
jest.spyOn(React, 'useEffect').mockImplementation(f => f());
delete window.location;
window = Object.create(window);
const host = "www.test.com";
const search = '?param=1'
Object.defineProperty(window, "location", {
value: {
host,
search
},
writable: true
});
describe('My tests', () => {
const render = () => shallow(
<MyComponent name='name' />
);
it('should pass', () => {
const rendered = render();
const url = 'www.test.com/name/mypath?param=1';
expect(window.location.href).toEqual(url);
});
});
解决方案
你忘了为你的组件解构 props 参数,
它应该是
const MyComponent = ({name}) => {
//rest of your code
}
原因是组件函数只接收一个参数,这是一个包含您传递的所有道具的对象。你所做的只是所谓的name
。我所做的是name
从道具对象中解构属性,即获取道具中传递的name
值
推荐阅读
- python - TypeError:函数调用的位置参数过多
- webgl - WebGL Multi-Render Target:对于drawBuffers,gl.BACK有什么作用?
- python - 在数据框中保持连续天数
- apache - 仅当环境变量具有特定值时如何设置 Apache 标头
- php - foreign key not migrate. I have some problems with migrations. I already well migrate company table
- android - 为什么 Android RecyclerView 将 match_parent 转换为 wrap_content 的行?
- c# - Sanford.Multimedia.Midi 没有 Midi 接收
- javascript - 如何使用 Vue Stripe Checkout 库为信用卡信息创建离散输入?
- error-handling - 警告消息:不推荐在 tibble 上设置行名称
- c++ - 将 s1 转换为以 s2 作为其子串的回文