如何解决“ TypeError:window.location不是函数”?

时间:2019-01-04 08:12:33

标签: unit-testing vue.js vuejs2 jestjs

当我运行包含有关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
      });
    });

有人遇到过这种情况吗?在这种情况下,我真的需要帮助。

1 个答案:

答案 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,但这应该可以正常工作)。