当我运行包含有关window.location逻辑的单元测试时。我会在终端上收到此错误。
TypeError:window.location [(中间值)(中间值)(中间值)]不是函数
35 | localVue.use(VueRouter);
> 36 | const router = new VueRouter(...routerOptions);
37 |
38 | Object.keys(filters).forEach(key => {
39 | localVue.filter(key, filters[key]);
我的样本单元测试代码仅包含有关window.location的逻辑
beforeEach(() => {
global.window = Object.create(window);
const url = "http://localhost.com";
Object.defineProperty(window, "location", {
value: {
href: url
},
writable: true
});
});
有人遇到过这种情况吗?在这种情况下,我真的需要帮助。
答案 0 :(得分:2)
在jest.config.js
中,您可以添加一个指向setup files的条目,该条目指向具有某些自定义配置的文件。在那里,您可以声明window
对象的方法和属性。例如,您的jest.config.file
可能像这样:
module.exports = {
...
'setupFiles': ['./tests/unit/config.main.js'],
...
}
然后,在/tests/unit/config.main.js
(或任何路径)中,您只需添加:
window.location = { value: { href: "http://localhost/" }};
在我自己的安装文件中,我也有以下window
助手,
window.alert = (msg) => { console.log(msg); };
window.matchMedia = () => ({});
window.scrollTo = () => { };
因此,应用程序中调用这些window
方法的代码不会破坏测试。
(我实际上从未尝试在安装文件中设置window.location
,但这应该可以正常工作)。