我有一个组件,我正在尝试使用 TestBed 设置和测试。
该组件包含一个在构造函数中具有参数的类,该参数是接口,而不是具体类。我选择使用的任何类都可以满足这个接口(无论是真正的类,还是用于单元测试的 mok 类)。但是当我在 TestBed 中构建使用此服务的组件时,我无法弄清楚如何将该参数定义到 TestBed 配置中。
这是该组件的 TestBed 配置:
describe('PanelContentAreaComponent', () => {
let component: PanelContentAreaComponent;
let fixture: ComponentFixture<PanelContentAreaComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ PanelContentAreaComponent
],
providers:[
MenuCommandService, ProcedureDataService, IOpenService],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
.compileComponents();
}));
在 TestBed 中构建有问题的服务是 ProcedureDataService 。它的定义如下:
@Injectable()
export class ProcedureDataService {
serverOpenFile: OpenFile;
constructor(private _openService: IOpenService) {
this.serverOpenFile = emptyFileStatus;
}
ProcedureDataService
is的构造函数中的一个参数IOpenService
的定义是:
export interface IOpenService {
openFile(fileType: string, dataType: string, filePath: string) ;
}
如您所见,这是一个接口,而不是具体的类。
在我的服务单元测试中,我们通过如下实现来模拟 IOpenService:
export class mockOpenService implements IOpenService{
constructor(){}
openFile(fileType: string, dataType: string, filePath: string) {
let fileContent: OpenFile;
...
...
[fake the data with mok junk]
...
fileContent = {
'filePath': filePath,
'fileName': name,
'openSuccess': isSuccess,
'error': errorMsg,
'fileData': jsonData
};
return Observable.of(fileContent);
}
}
这在 ProcedureDataService 服务单元测试中效果很好。当然,在实际代码中,我们使用完整实现的文件打开服务来实现 IOpenService,该服务可以正确获取数据。
但是在尝试在组件内部使用此服务时,我收到以下错误:
PanelContentAreaComponent should create FAILED
Failed: IOpenService is not defined
ReferenceError: IOpenService is not defined
这是有道理的,所以我试图弄清楚如何告诉 TestBed 我有一个我希望使用的 IOpenService 的具体类实现。我试过这个,但它失败了:
describe('PanelContentAreaComponent', () => {
let component: PanelContentAreaComponent;
let fixture: ComponentFixture<PanelContentAreaComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ PanelContentAreaComponent
],
providers:[
{provide: IOpenService, useClass: mockOpenService},
MenuCommandService, ProcedureDataService, IOpenService],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
.compileComponents();
}));
编译器告诉我:
(31,19): error TS2693: 'IOpenService' only refers to a type, but is being used as a value here.
我仍然得到:
PanelContentAreaComponent should create FAILED
Failed: IOpenService is not defined
ReferenceError: IOpenService is not defined
那么,我如何指示TestBed
我有一个接口参数()的特定类(mockOpenService
)实现,该接口参数()是为测试此组件()而提供IOpenService
的服务()所需的?ProcedureDataService
PanelContentAreaComponent