【问题标题】:Stackblitz simple MatDialog example unable to find ComponentFactoryStackblitz 简单 MatDialog 示例无法找到 ComponentFactory
【发布时间】:2019-12-11 17:22:30
【问题描述】:

我正在尝试设置一个stackblitz example 来就我在测试中遇到的问题提出一个更复杂的问题。

但是,在设置基本示例时,当我的基本测试通过时,单击按钮以显示 MatDialog 会引发无法找到 ComponentFactory 的错误。但我已将其添加到 app.module.ts 中的声明和 entryComponent 中。我错过了什么。?

附言代码本身适用于我更大的项目,这与我在 Stackblitz 中设置它的方式有关,这似乎是问题所在。

p.p.s 根据下面 Maihan 的回答,我开始思考这个想法本身。即使它构建并运行,这个想法也会抱怨无法找到 AddUserDialog 组件。但不知道为什么。

app.component.ts

import { Component } from '@angular/core';
import { MatDialog, MatDialogConfig } from '@angular/material';
import { AddUserDialogComponent } from './AddUserDialogComponent';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {

constructor(public dialog: MatDialog){
};

openAddUserDialog(): void{
   const dialogConfig = new MatDialogConfig();

   dialogConfig.data = {
        employeeList:['foo', 'bar'],
        roles: ['fiz', 'faz']
    };

   const dialogRef = this.dialog.open(AddUserDialogComponent, dialogConfig);

   dialogRef.afterClosed().subscribe((data) => {
   console.log('hello');
   });
 }
}

app.module.ts

import { NgModule } from '@angular/core';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { MatDialogModule, MatDialogRef, MatDialog } from '@angular/material/dialog';
import { AddUserDialogComponent } from './AddUserDialogComponent';

import { AppComponent } from './app.component';

@NgModule({
  imports:      [ BrowserModule, FormsModule, MatDialogModule, NoopAnimationsModule ],
  declarations: [ AppComponent, AddUserDialogComponent ],
  exports: [AppComponent, AddUserDialogComponent],
  entryComponents: [ AddUserDialogComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

【问题讨论】:

    标签: angular unit-testing jasmine stackblitz


    【解决方案1】:

    app.component.ts@angular/material/dialog 导入:

    import { MatDialog, MatDialogConfig } from '@angular/material/dialog';
    

    代替:

    import { MatDialog, MatDialogConfig } from '@angular/material';
    

    并为 root 注入它。如果您在服务中使用它或用于延迟加载的模块,通常会发生这种情况。

    @Injectable({ providedIn: 'root' })
    export class AddUserDialogComponent implements OnInit {}
    

    您正在动态加载AddUserDialogComponent,因此,您添加了app.module.ts > entryComponents。你需要在测试单元中做同样的事情:

    beforeEach(async(() => {
      TestBed.configureTestingModule({
        imports: [RouterTestingModule, MatDialogModule, NoopAnimationsModule],
        providers: [AddUserDialogComponent],
        declarations: [AppComponent, AddUserDialogComponent]
      })
        .overrideModule(BrowserDynamicTestingModule, {
          set: { entryComponents: [AddUserDialogComponent] }
        })
        .compileComponents();
    }));
    

    另外,将<my-app></my-app> 添加到您的index.html 以消除控制台中的以下错误:

    选择器“my-app”没有匹配任何元素

    【讨论】:

    • 感谢您的回复。 的好消息我想知道为什么这是一个问题。我确实在模块级别从 angular/material/dialog 导入。我现在也更改为组件级别的角度/材料/对话框。不幸的是,我仍然遇到同样的问题。
    • 再次感谢您。它似乎与应用程序本身无关。这是关于测试的事情。如果您单击右侧的第一个按钮(应用程序),它将起作用。如果单击测试创建的按钮,则会抛出错误。
    • 轰隆隆!就是这样。太感谢了。我很确定这也将解决我更高级别的问题。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2015-02-06
    • 2012-03-13
    • 2017-03-26
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多