Angular TypeError:无法读取属性';客户';茉莉花中未定义的

Angular TypeError:无法读取属性';客户';茉莉花中未定义的,angular,typescript,jasmine,karma-jasmine,Angular,Typescript,Jasmine,Karma Jasmine,对于下面的EditFlag组件,我编写了角度测试用例。在执行spec文件中提到的以下测试用例时,我看到了这个错误TypeError:无法读取未定义的属性'client' 另外,我想在我的测试用例中包含switch case的测试用例。 有人能帮我处理这个测试用例吗 editflag.component.ts constructor(private flagService: FlagService, private editFlagDialog: MatDialogRef<EditFlagC

对于下面的EditFlag组件,我编写了角度测试用例。在执行spec文件中提到的以下测试用例时,我看到了这个错误TypeError:无法读取未定义的属性'client'

另外,我想在我的测试用例中包含switch case的测试用例。 有人能帮我处理这个测试用例吗

editflag.component.ts

constructor(private flagService: FlagService,
private editFlagDialog: MatDialogRef<EditFlagComponent>),
@Inject(MAT_DIALOG_DATA) public data: any,
private dialog: MatDialog){}

ngOnInit: void {
    switch(this.data.action) {
        case 'create':
            this.flagClone = this.initializeFlagClone();
            break;
        case 'edit':
            this.flagEdit();
            break;
        default:
            console.log('No action');
    }
}

public flagEdit(){
    const res = {...this.data};
    this.flagVar = { ...res.flag};
    if(this.data.flag.client == null ) {
        this.isSearch = false;
        this.initializeClient();
    }
}
const testData = {
    "flag":{
        id: null, //string
        description: null,  //string
        url: null,      //string
        client: null
    },
    "action": "edit"
};

beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        RouterTestingModule
      ],
      declarations: [
        EditFlagComponent
      ],
      providers: [
        HttpClient,
        HttpHandler,
        {provide: MatDialog, useValue: {} },
        {provide: MatDialogRef, useValue: {} },
        {provide: MAT_DIALOG_DATA, useValue: {testData} },
      ]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(EditFlagComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });
  
it('should call flagEdit',() => {
    component.flag.client = testData.flag.client;
    component.flagEdit();
    fixture.detectChanges();
    expect(component.isSearch).tobeFalsy();
});
此外,希望覆盖范围摘要中包含以下块:

switch(this.data.action) {
        case 'create':
            this.flagClone = this.initializeFlagClone();
            break;
        case 'edit':
            this.flagEdit();
            break;
        default:
            console.log('No action');
    }

我认为你做错了

更改此行:

{provide: MAT_DIALOG_DATA, useValue: {testData} },
为此:

{provide: MAT_DIALOG_DATA, useValue: testData },
然后拆下线路

component.flag.client = testData.flag.client;

在单元测试中。

我认为您的
useValue
做得不对

更改此行:

{provide: MAT_DIALOG_DATA, useValue: {testData} },
为此:

{provide: MAT_DIALOG_DATA, useValue: testData },
然后拆下线路

component.flag.client = testData.flag.client;
在单元测试中。

错误为TypeError:无法读取未定义的属性“client”。此错误在
This.data.flag.client==null行中抛出

您定义了
@Inject(MAT_DIALOG_DATA)公共数据:any,
,并且在测试中您有
{provide:MAT_DIALOG_DATA,useValue:{testData},
这就像有{provide:MAT_DIALOG_DATA,useValue:{testData:testData}}},`即

this.data = { testData: {
    "flag":{
        id: null, //string
        description: null,  //string
        url: null,      //string
        client: null
    },
    "action": "edit"
}}
现在出现了问题,您没有设置
this.data.flag

要解决这个问题,只需将
{provide:MAT\u DIALOG\u DATA,useValue:{testData}},
设置为
{provide:MAT\u DIALOG\u DATA,useValue:testData},
,现在您将正确地提供值错误为TypeError:无法读取未定义的属性“client”。此错误在
This.data.flag.client==null行中抛出

您定义了
@Inject(MAT_DIALOG_DATA)公共数据:any,
,并且在测试中您有
{provide:MAT_DIALOG_DATA,useValue:{testData},
这就像有{provide:MAT_DIALOG_DATA,useValue:{testData:testData}}},`即

this.data = { testData: {
    "flag":{
        id: null, //string
        description: null,  //string
        url: null,      //string
        client: null
    },
    "action": "edit"
}}
现在出现了问题,您没有设置
this.data.flag


要解决这个问题,只需将
{provide:MAT_DIALOG_DATA,useValue:{testData}},
设置为
{provide:MAT_DIALOG_DATA,useValue:testData},
,现在当我使用
{provide:MAT DIALOG_DATA,useValue:testData}从测试数据ie中删除括号时,您将正确地提供值。我收到TypeError:_this.handler.handle不是一个函数通过在每次(()=>{TestBed.resetTestingModule();})之后添加
解决了此问题以及如何涵盖此开关案例
案例“创建”:this.flagClone=this.initializeFlagClone();打破默认值:console.log('No action')。当我使用此
{provide:MAT\u DIALOG\u DATA,useValue:testData}
从testData ie中删除括号时。我收到TypeError:_this.handler.handle不是一个函数通过在每次(()=>{TestBed.resetTestingModule();})之后添加
解决了此问题以及如何涵盖此开关案例
案例“创建”:this.flagClone=this.initializeFlagClone();打破默认值:console.log('No action')。我确实尝试了您上面提到的更改,但得到了TypeError:\u this.handler.handle不是函数我确实尝试了您上面提到的更改,但得到了TypeError:\u this.handler.handle不是函数