Angular and Jasmine MAT_DIALOG_DATA "TypeError: ctx.currentRoles is undefined "
Angular and Jasmine MAT_DIALOG_DATA "TypeError: ctx.currentRoles is undefined "
我的任务是为我们团队正在开发的应用程序的组件编写 Karma/Jasmine 测试。我不是将我实际拥有的实际组件 运行 写入错误的人,到目前为止我还没有找到答案。
这是 deleteuser.component.ts 代码:
import {MatTableDataSource} from '@angular/material/table';
import {MatSort} from '@angular/material/sort';
import {MatPaginator} from '@angular/material/paginator';
import {PCplanUser} from 'src/app/models/pcplanUser';
import {PCplanRole} from 'src/app/models/pcplanRole';
import { InitService } from 'src/app/services/pcplan/initializer.service';
import { TlsApiService } from 'src/app/services/api/user-apiservice';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { FormControl, FormBuilder, FormGroup} from '@angular/forms';
@Component({
selector: 'app-deleteuser',
templateUrl: './deleteuser.component.html',
styleUrls: ['./deleteuser.component.scss'],
})
export class DeleteUserComponent implements OnInit, AfterViewInit {
name :string = this.data.fullname
confirmdelete :string = "Confirm Delete"
currentRoles: any;
constructor(
public dialogRef: MatDialogRef<DeleteUserComponent>,
@Inject(MAT_DIALOG_DATA) public data: any
) {
console.log('data passed in is:', this.data);
}
ngAfterViewInit(): void {
}
ngOnInit() {
this.currentRoles = this.data.role.split(',');
}
onCancelClick(): void {
this.dialogRef.close();
}
ConfirmDelete() {
}
}
这是 deleteuser.component.spec.ts 的一些代码,我曾尝试过尝试获得一个好的测试但未成功。
import { DeleteUserComponent } from './deleteuser.component';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { Component } from '@angular/core';
import { of } from 'rxjs';
describe('DeleteUserComponent', () => {
let component: DeleteUserComponent;
let fixture: ComponentFixture<DeleteUserComponent>;
let mockMatDialogRef, mockMAT_DIALOG_DATA;
let currentRoles: any;
/*@Component({
selector: 'app-deleteuser',
template: '<div></div>'
})
class fakeDeleteUserComponent{
static data: string = 'Admin';
} */
beforeEach(async(() => {
mockMAT_DIALOG_DATA = jasmine.createSpyObj(['role']);
mockMAT_DIALOG_DATA.role = jasmine.createSpyObj(['split']);
TestBed.configureTestingModule({
declarations: [ DeleteUserComponent, fakeDeleteUserComponent ],
providers: [
{provide: MatDialogRef, useValue: mockMatDialogRef},
{provide: MAT_DIALOG_DATA, useValue: mockMAT_DIALOG_DATA},
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DeleteUserComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
使用当前的测试用例时出现此错误。
我试图在规范文件中定义 currentRoles,但它不起作用。到目前为止我所做的所有搜索都没有指出我的错误的答案。
如果您没有立即收到我的回复,那是因为我这周剩下的时间都在休假。
使用怎么样
const mockDialogData= {
role : {
split: () => {} // or return whatever you want as a function
}
};
然后将其用作:
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ DeleteUserComponent, fakeDeleteUserComponent ],
providers: [
{provide: MatDialogRef, useValue: mockMatDialogRef},
{provide: MAT_DIALOG_DATA, useValue: mockDialogData}, // <-- use it here
]
})
.compileComponents();
}));
让我知道这是否有效。
在与创建组件的队友交谈并自行进行一些实验后,我能够进行
的默认测试
it('should create', () => {
expect(component).toBeTruthy();
});
问题是在基本的 beforeEach 语句中调用了一个 detectChanges()。但是,此组件设计为在打开时需要用户信息。
测试传递用户信息是我尚未进行的集成测试的一部分。
通过将 detectChanges 移动到我正在测试组件实际功能的任何测试,而不是在 beforeEach 中,我能够让测试通过。
额外的好处是学到了一些东西。
我的任务是为我们团队正在开发的应用程序的组件编写 Karma/Jasmine 测试。我不是将我实际拥有的实际组件 运行 写入错误的人,到目前为止我还没有找到答案。
这是 deleteuser.component.ts 代码:
import {MatTableDataSource} from '@angular/material/table';
import {MatSort} from '@angular/material/sort';
import {MatPaginator} from '@angular/material/paginator';
import {PCplanUser} from 'src/app/models/pcplanUser';
import {PCplanRole} from 'src/app/models/pcplanRole';
import { InitService } from 'src/app/services/pcplan/initializer.service';
import { TlsApiService } from 'src/app/services/api/user-apiservice';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { FormControl, FormBuilder, FormGroup} from '@angular/forms';
@Component({
selector: 'app-deleteuser',
templateUrl: './deleteuser.component.html',
styleUrls: ['./deleteuser.component.scss'],
})
export class DeleteUserComponent implements OnInit, AfterViewInit {
name :string = this.data.fullname
confirmdelete :string = "Confirm Delete"
currentRoles: any;
constructor(
public dialogRef: MatDialogRef<DeleteUserComponent>,
@Inject(MAT_DIALOG_DATA) public data: any
) {
console.log('data passed in is:', this.data);
}
ngAfterViewInit(): void {
}
ngOnInit() {
this.currentRoles = this.data.role.split(',');
}
onCancelClick(): void {
this.dialogRef.close();
}
ConfirmDelete() {
}
}
这是 deleteuser.component.spec.ts 的一些代码,我曾尝试过尝试获得一个好的测试但未成功。
import { DeleteUserComponent } from './deleteuser.component';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { Component } from '@angular/core';
import { of } from 'rxjs';
describe('DeleteUserComponent', () => {
let component: DeleteUserComponent;
let fixture: ComponentFixture<DeleteUserComponent>;
let mockMatDialogRef, mockMAT_DIALOG_DATA;
let currentRoles: any;
/*@Component({
selector: 'app-deleteuser',
template: '<div></div>'
})
class fakeDeleteUserComponent{
static data: string = 'Admin';
} */
beforeEach(async(() => {
mockMAT_DIALOG_DATA = jasmine.createSpyObj(['role']);
mockMAT_DIALOG_DATA.role = jasmine.createSpyObj(['split']);
TestBed.configureTestingModule({
declarations: [ DeleteUserComponent, fakeDeleteUserComponent ],
providers: [
{provide: MatDialogRef, useValue: mockMatDialogRef},
{provide: MAT_DIALOG_DATA, useValue: mockMAT_DIALOG_DATA},
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DeleteUserComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
使用当前的测试用例时出现此错误。
我试图在规范文件中定义 currentRoles,但它不起作用。到目前为止我所做的所有搜索都没有指出我的错误的答案。
如果您没有立即收到我的回复,那是因为我这周剩下的时间都在休假。
使用怎么样
const mockDialogData= {
role : {
split: () => {} // or return whatever you want as a function
}
};
然后将其用作:
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ DeleteUserComponent, fakeDeleteUserComponent ],
providers: [
{provide: MatDialogRef, useValue: mockMatDialogRef},
{provide: MAT_DIALOG_DATA, useValue: mockDialogData}, // <-- use it here
]
})
.compileComponents();
}));
让我知道这是否有效。
在与创建组件的队友交谈并自行进行一些实验后,我能够进行
的默认测试 it('should create', () => {
expect(component).toBeTruthy();
});
问题是在基本的 beforeEach 语句中调用了一个 detectChanges()。但是,此组件设计为在打开时需要用户信息。
测试传递用户信息是我尚未进行的集成测试的一部分。
通过将 detectChanges 移动到我正在测试组件实际功能的任何测试,而不是在 beforeEach 中,我能够让测试通过。
额外的好处是学到了一些东西。