VueJs 如何删除全局错误处理程序以使用 vue-test-utils 进行测试

Posted

技术标签:

【中文标题】VueJs 如何删除全局错误处理程序以使用 vue-test-utils 进行测试【英文标题】:VueJs how to remove global error handler for testing with vue-test-utils 【发布时间】:2020-10-19 09:03:56 【问题描述】:

我正在 vue 中为画布运行单元测试(测试通过)。但是我收到错误 console.error node_modules/@vue/test-utils/dist/vue-test-utils.js:1735 [vue-test-utils]: Global error handler detected (Vue.config.errorHandler). Vue Test Utils sets a custom error handler to throw errors thrown by instances. If you want this behavior in your tests, you must remove the global error handler.

我尝试停用错误处理程序,但这似乎不受支持? https://vuejs.org/v2/api/#errorHandler我如何应用错误消息中的建议?

这里有一个类似的问题:How to disable the "Global error handler detected" warning in vue test utils,但没有有用的答案。

我的测试是使用 jest 和 fabric 编写的(用于画布):

import FabricCanvas from './FabricCanvas';
import  fabric  from 'fabric';
import  shallowMount   from '@vue/test-utils';

import PolygonDrawing from "@/components/labeling/editor/drawing/PolygonDrawing";

function getFabricCanvas(): fabric.Canvas 
  const wrapper = shallowMount (FabricCanvas);
  const canvas = wrapper.get('#main-canvas').html();
  return new fabric.Canvas(canvas, 
      width: 1024,
      height: 1024,
   as any);


let fCanvas: fabric.Canvas | undefined;

beforeAll(() => 
  fCanvas = getFabricCanvas();
)

  test('add a Polygon to the canvas startDrawingPolygon and stopDrawingPolygon', () => 
    const polygonDrawing = new PolygonDrawing();
    if (fCanvas) 
      expect(fCanvas._objects.length).toStrictEqual(0);
    
    const objectClass = 'Vehicle';
    const shapeType = 'polygon';
    let startMousePoint = x: 200, y: 200;
    polygonDrawing.startDrawingPolygon(fCanvas, startMousePoint, objectClass, shapeType);
    startMousePoint = x: 300, y: 300;
    polygonDrawing.startDrawingPolygon(fCanvas, startMousePoint, objectClass, shapeType);
    startMousePoint = x: 200, y: 300;
    polygonDrawing.startDrawingPolygon(fCanvas, startMousePoint, objectClass, shapeType);
    
    if (fCanvas) 
      polygonDrawing.stopDrawingPolygon(fCanvas, shapeType, objectClass);
      expect(fCanvas._objects.length).toStrictEqual(1);
    
  )
);

使用文件 FabricCanvas.vue 模拟画布:

<template>
    <div id="canvas-container">
        <canvas   id="main-canvas"></canvas>
    </div>
</template>

<script lang="ts">
    import Component, Vue from 'vue-property-decorator';

    @Component
    export default class FabricCanvas extends Vue 
    
</script>

<style scoped> </style>

【问题讨论】:

你在哪里设置Vue.config.errorHandler?您在哪里尝试停用它? 我没有在任何地方明确设置Vue.config.errorHandler,它只是vue-test-utils.js 的一部分。我尝试使用import Vue from 'vue'; Vue.config.errorHandler = function (err, vm, info) console.log('hi there'); // handle error // `info` is a Vue-specific error info, e.g. which lifecycle hook // the error was found in. Only available in 2.2.0+ 在测试文件(上述文件)中未成功停用它 如果我在我的主代码中明确设置警告,然后运行测试,我只能重现警告,所以我假设你的代码必须以某种方式设置它。此外,您的停用代码并没有真正按照您的意图进行,因为它只是设置了一个新的错误处理程序(即使它是无操作的)。要停用它,请将其设置为 null。 嘿,好吧,我真的不知道那可能在哪里......我怎么能找到?搜索errorHandler 不会产生任何结果,除了提到的vue-test-utils.js。另外,我如何将其设置为null? Vue.config.errorHandler = null; 给了我一个 Typescript 错误:Type 'null' is not assignable to type '(err: Error, vm: Vue, info: string) =&gt; void'. 谢谢! 【参考方案1】:

感谢@tony19 的提示,我找到了解决方案:我的 router/index.js 中有一个来自 Elastic 的插件,名为 APM(应用程序性能监控):import ApmVuePlugin from '@elastic/apm-rum-vue';

这是对重复的全局错误处理程序负责,在测试期间停用它解决了错误消息。

【讨论】:

以上是关于VueJs 如何删除全局错误处理程序以使用 vue-test-utils 进行测试的主要内容,如果未能解决你的问题,请参考以下文章

Vue JS 组件中如何使用全局变量?

在子文件夹中的 Vuejs 中全局注册组件

如何在我的 Vue Graphql 组件中使用错误并让其他错误在全局范围内处理?

如何使用 nginx 服务器处理 vuejs SPA 中的 404 错误请求

Vuejs 深入浅出 - 组件

如何在 Vue js 中创建一个组件以永远不会删除我添加到其中的数据?当我切换路由时,组件会删除它获得的所有数据