代码之家  ›  专栏  ›  技术社区  ›  Hoang Subin

如何修复“typeerror:window.location不是函数”?

  •  1
  • Hoang Subin  · 技术社区  · 6 年前

    当我运行包含window.location逻辑的单元测试时。我将在终端上得到这个错误。

    类型错误: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 回复  |  直到 6 年前
        1
  •  2
  •   Sergeon    6 年前

    在你 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.alert = (msg) => { console.log(msg); };
    window.matchMedia = () => ({});
    window.scrollTo = () => { };
    

    所以在你的应用程序中调用这些 窗口 方法不会破坏测试。

    (实际上我从未尝试过设置 window.location 在安装文件中,但这应该是直接工作的)。