unit-testing - 如何修复 "TypeError: window.location is not a function"?

标签 unit-testing vue.js vuejs2 jestjs

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

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

最佳答案

在您的 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 方法的代码不会破坏测试。

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

关于unit-testing - 如何修复 "TypeError: window.location is not a function"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54035213/

相关文章:

python - 在不使用模拟的情况下检查函数是否已在 Python unittest 中调用的规范方法是什么?

javascript - 从 vueJS 方法调用的 setTimeout() 不起作用

vue.js - npm 运行服务器抛出错误 sh : 1: vue-cli-service: not found

python - 如何在 FastAPI 中的测试之间设置和拆除数据库?

android - 单元测试 Bolts Tasks With Continuations (Android)

vuejs2 - 具有固定参数的 Vue-router 别名

javascript - VueJs 中全局加载的数据有时为 null

javascript - VueJS : Use multiple component inside a reusable component

java - 模拟时 junit 出错

javascript - 如何将 Vue 属性设置为字符串化元素属性的值?