【问题标题】:Angular Unit Test (w/ Jest) a service that imports and uses an esm module;Angular Unit Test (w/ Jest) 一个导入和使用 esm 模块的服务;
【发布时间】:2020-08-07 10:49:25
【问题描述】:

说明

我有一个使用 Angular (v 9)、Jest (24.9.0) 和 ECMAScript 模块 (dialog-polyfill (v 0.5.1) ) 的单元测试问题。这个 polyfill 添加了对HTMLDialogElement 的支持。问题是,当对话框在 DOM 中时,它有一个方法 registerDialog 需要调用。它将对话框元素作为它的唯一参数。我创建的这个服务注册了对话框并将其添加到数组中。一切都与实现完美配合,但测试失败,因为它不知道 polyfill 是什么。我不断收到以下错误:

TypeError: 无法读取未定义的属性“registerDialog”

  • 注意:我对 Angular 中的测试还很陌生,我的实现可能不正确;如果有,请告诉我。
  • 第二个注意事项:我注意到除了在 Jest 测试中对文档调用 createElement 之外,是否还有更好的方法来创建对话框元素。

对话服务

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

import dialogPolyfill from 'dialog-polyfill';

@Injectable({
  providedIn: 'root'
})
export class DialogService {
  public dialogs$: BehaviorSubject<HTMLDialogElement[]> = new BehaviorSubject<
    HTMLDialogElement[]
  >([]);

  private dialogs: [] = [];

  constructor() {}

  register(dialog: HTMLDialogElement) {
    dialogPolyfill.registerDialog(dialog);
    this.dialogs$.next([...this.dialogs, dialog]);
  }
}

对话服务规范

import { TestBed } from '@angular/core/testing';

import { DialogService } from './dialog.service';

describe('DialogService', () => {
  let service: DialogService;

  beforeEach(() => {
    TestBed.configureTestingModule({});
    service = TestBed.inject(DialogService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  it('should register a dialog', () => {
    expect(service.dialogs$.getValue().length).toBe(0);
    service.register(document.createElement('dialog'));
    expect(service.dialogs$.getValue().length).toBe(1);
  });
});

参考文献

【问题讨论】:

    标签: javascript angular jestjs


    【解决方案1】:

    您需要在您的 TestBed 中提供您的服务:

    beforeEach(() => {
      TestBed.configureTestingModule({
        providers: [DialogService] 
      });
      service = TestBed.inject(DialogService);
    });
    

    【讨论】:

    • 这并不能解决问题。我发现解决此错误的唯一方法是检查dialogPolyfill 是否确实存在于服务本身中: if (dialogPolyfill) { dialogPolyfill.registerDialog(dialog); }
    • 你是否在 main.spec.ts 中导入了那个 polyfill?
    • 我没有main.spec.ts。我有一个 test-setup.ts 正在导入 jest-preset-angular
    • 你能检查一下angular.json文件中是否有“test.options.polyfills”属性吗?
    • 算了...我刚刚读到这里没有使用任何业力配置。
    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 2020-08-12
    • 2019-07-01
    • 1970-01-01
    • 2020-08-13
    相关资源
    最近更新 更多