Mapbox、Angular、jest 单元测试失败

问题描述 投票:0回答:1

我有一个mapbox.service.ts

import * as mapboxgl from 'mapbox-gl';
在这个服务中我只是创建了这个mapbox地图

this.map = new mapboxgl.Map({
  accessToken: this.accessToken,
  container: 'mapbox-container',
  style: 'mapbox://styles/mapbox/streets-v12',
  center: { lat: 43.238949, lng: 76.889709 },
  zoom: this.currentZoom,
});

应用程序运行良好。 但是,当我运行 jest 单元测试时,这个 mapbox.service.spec.ts 失败了。

ReferenceError: TextDecoder is not defined

      1 | import { Injectable } from '@angular/core';
    > 2 | import * as mapboxgl from 'mapbox-gl';

在mapbox.service.spec.ts内我没有添加任何测试用例。

import { inject, TestBed } from '@angular/core/testing';
import { MapboxService } from './mapbox.service';

describe('Service: Mapbox', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [MapboxService],
    });
  });

  it('should ...', inject([MapboxService], (service: MapboxService) => {
    expect(service).toBeTruthy();
  }));
});

为什么没有定义TextDecoder?

我将 setup.jest.ts 文件更改为

import 'jest-preset-angular/setup-jest';
import { TextEncoder } from 'node:util';

global.TextEncoder = TextEncoder;

在网上我找到了这个解决方案,然后我尝试了一下,但它显示其他错误:

Test suite failed to run

    src/setup.jest.ts:2:29 - error TS2307: Cannot find module 'node:util' or its corresponding type declarations.

    2 import { TextEncoder } from 'node:util';
                                  ~~~~~~~~~~~
    src/setup.jest.ts:4:1 - error TS2304: Cannot find name 'global'.

    4 global.TextEncoder = TextEncoder;

我只是使用常规的 MapBox 地图,没什么特别的。 有人在他们的应用程序中使用 Mapbox,如何修复此单元测试失败?

angular mapbox ts-jest mapbox-gl
1个回答
0
投票

我明白为什么会发生错误。这是因为 Node 版本和 mapbox-gl 版本彼此不兼容。

  1. 我降级了 Node 版本,但错误仍然存在。 我的节点版本是v20降级到(v18,v16,v14)。

  2. 我没有碰Node版本,然后开始降级mapbox-gl版本。 我当前的mapbox-gl版本是v3.1.2.,然后我将其降级,直到错误消息消失。所以,当mapbox-gl版本变成v2.15.0时,错误就消失了。

现在一切正常,这可能对那些将来可能面临同样问题的人有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.