在使用Angular、Jasmine和Karma进行测试执行时,出现了意外的合成属性@hoge的错误

首先

由于尝试使用Angular、Jasmine和Karma来执行包含动画的组件测试时遇到了一些困难,特此记录备忘。

前提 tí) : premise

测试的组件使用了@angular/animations。
而且,app.module.ts文件已经导入了BrowserAnimationsModule。

import { Component } from '@angular/core';
import { trigger, state, style, transition, animate } from '@angular/animations'

@Component({
  selector: 'app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
  animations: [
    trigger('hoge', [
      state('a', style({ height: '*', opacity: 1 })),
      state('b', style({ height: '0', opacity: 0 })),
      transition('a => b', [animate('1s')]),
      transition('b => a', [animate('1s')]),
    ]),
  ],
})
export class AppComponent {
  ...
}

有很多原因

在测试文件(app.component.spec.ts)中,无法导入BrowserAnimationsModule。

import { TestBed } from '@angular/core/testing';
import { AppComponent } from './app.component';

describe('App', () => {
  beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [AppComponent],
    }).compileComponents();
  });

  it('hoge', () => {
    ...
  });
});

通过在每个测试前导入BrowserAnimationsModule来解决了这个问题。

import { TestBed } from '@angular/core/testing';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; // 追加
import { AppComponent } from './app.component';

describe('App', () => {
  beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [AppComponent],
      imports: [BrowserAnimationsModule], // 追加
    }).compileComponents();
  });

  it('hoge', () => {
    ...
  });
});