【问题标题】:Angular: ERROR: ''mat-form-field' is not a known elementAngular:错误:''mat-form-field' 不是已知元素
【发布时间】:2020-08-10 07:25:34
【问题描述】:

执行单元测试时,我收到如下错误:

错误:''mat-form-field' 不是已知元素

错误:''mat-grid-tile' 不是已知元素

等等

app.module.ts 中缺少导入时,通常会出现这些错误,但我确定它们是可用的:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { NavigationviewComponent } from './navigationview/navigationview.component';
import { MainviewComponent } from './mainview/mainview.component';
import { DetailviewComponent } from './detailview/detailview.component';
import { TodolistComponent } from './todolist/todolist.component';
import { ListitemComponent } from './listitem/listitem.component';
import { ListitemdetailComponent } from './listitemdetail/listitemdetail.component';

import { DonePipe } from './DonePipe';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatNativeDateModule } from '@angular/material/core';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatButtonModule} from '@angular/material/button';
import {MatIconModule} from '@angular/material/icon';
import {MatBadgeModule} from '@angular/material/badge';
import {MatGridListModule} from '@angular/material/grid-list';
import {MatSnackBarModule} from '@angular/material/snack-bar';

import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';

import { Configuration } from 'msal';
import {
  MsalModule,
  MsalInterceptor,
  MSAL_CONFIG,
  MSAL_CONFIG_ANGULAR,
  MsalService,
  MsalAngularConfiguration
} from '@azure/msal-angular';

import { isIE, msalAngularConfig, msalConfig } from './app-config';

function MSALConfigFactory(): Configuration {
  return msalConfig;
}

function MSALAngularConfigFactory(): MsalAngularConfiguration {
  return msalAngularConfig;
}

@NgModule({
  declarations: [
    AppComponent,
    NavigationviewComponent,
    MainviewComponent,
    DetailviewComponent,
    TodolistComponent,
    ListitemComponent,
    ListitemdetailComponent,
    DonePipe
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    HttpClientModule,
    BrowserAnimationsModule,
    FormsModule,
    CommonModule,
    MsalModule,
    MatDatepickerModule,
    MatNativeDateModule,
    MatInputModule,
    MatFormFieldModule,
    MatButtonModule,
    MatIconModule,
    MatBadgeModule,
    MatGridListModule,
    MatSnackBarModule
  ],
  exports: [
    MatDatepickerModule,
    MatNativeDateModule,
    MatInputModule,
    MatFormFieldModule,
    MatButtonModule,
    MatIconModule,
    MatBadgeModule,
    MatGridListModule,
    MatSnackBarModule
  ],
  providers: [
    MatFormFieldModule,
    MatDatepickerModule,
    MatNativeDateModule,
    MatButtonModule,
    {
      provide: HTTP_INTERCEPTORS,
      useClass: MsalInterceptor,
      multi: true
    },
    {
      provide: MSAL_CONFIG,
      useFactory: MSALConfigFactory
    },
    {
      provide: MSAL_CONFIG_ANGULAR,
      useFactory: MSALAngularConfigFactory
    },
    MsalService
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

是否还有其他必须考虑的因素才能使错误不出现?

提前致谢

【问题讨论】:

  • 缺少单元测试的设置

标签: angular typescript


【解决方案1】:

在单元测试文件中,你必须导入MatFormFieldModule & MatGridListModule

【讨论】:

    【解决方案2】:

    尝试在您的 .spec 文件中导入 MatFormFieldModule, MatGridListModule 以告知编译器 Mat Form 和 Grid 元素。

    编辑: beforeEach 根据 Phillip 的建议 :)

    beforeEach(() => {
      TestBed.configureTestingModule({
      imports: [MatFormFieldModule, MatGridListModule], // <== need to import both modules.
        providers: [...],
        declarations: [...],
     });
    });
    

    【讨论】:

    • 最好使用beforeEach 以便在每次测试之前初始化并执行TestBed,而不是一开始就执行一次。这样,“测试环境”是干净的,不会发生副作用。此外,在 before/after 回调中添加 done()/async-await 逻辑也不是一个好主意。只需将 beforeEach-callback 定义为 async,测试运行器就会处理所有事情。最后,导入模块并添加 NO_ERRORS_SCHEMA 最终会使导入变得无用,因为无论如何都会隐藏任何缺少导入的错误:)
    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 2018-10-24
    • 2021-01-22
    • 1970-01-01
    • 2018-02-20
    • 2018-02-07
    • 2019-06-27
    • 2020-03-31
    相关资源
    最近更新 更多