我的组件中有以下代码:
ngOnInit() {
this.formattedPacks = this.protocolPackService.formatPacks(this.selectedPacks);
}
在我的测试中,我收到以下错误:
this.protocolPackService.formatPacks is not a function
formatPacks
方法是一个辅助函数,没有任何返回数组的服务器请求。我不希望它表现得像我必须窥探和模拟结果的任何其他服务方法。
我也可以模拟formatPacks
,但我在两个不同的测试中使用它,它应该为每个测试产生不同的输出。
我怎样才能确保它在我的测试中正确执行?
我在我的测试中模拟了其他protocolPackService
方法(API调用),如下所示:
const ppackService = jasmine.createSpyObj('ProtocolPackService', ['listPacks', 'findPackDevices']);
const packListResult = '{}';
const packDevicesResult = '{}';
const getPackListSpy = ppackService.listPacks.and.returnValue( Promise.resolve(packListResult) );
const findPackDevicesSpy = ppackService.findPackDevices.and.returnValue( of(packDevicesResult) );
在我的提供者:
providers: [
{ provide: ProtocolPackService, useValue: ppackService },
ToastService]
根据提到的细节,如果您需要使用formatPacks
的原始方法,则需要为该依赖项创建单独的实例,然后在测试中使用它。
试试这个以进行测试
beforeEach(
"...",
inject([ProtocolPackService], protoPackService => {
ppackService = jasmine.createSpyObj("ProtocolPackService", {
listPacks: () => {},
findPackDevices: () => {},
formatPacks: packs => {
protoPackService.formatPacks(packs);
},
});
}),
);
好的,所以你的方法的问题是你需要使用useClass
,并创建一个存根:
class PpackServiceStub{
formatPacks(){
// return whatever you are expecting, be it promise or Observable using of()
}
// create other methods similary with expected Output
}
在providers
providers: [
{ provide: ProtocolPackService, useClass: PpackServiceStub },
ToastService
]
现在,让我们假设您要检查2种不同的服务行为,然后您需要创建一个spy
。我将举一个函数checkIfHuman()
的例子,所以我将添加:
class PpackServiceStub{
formatPacks(){
// return whatever you are expecting, be it promise or Observable using of()
}
checkIfHuman(){
return of({val : true})
}
}
使用component.ts
代码如下:
ngOnInit() {
this.protocolPackService.checkIfHuman().subscribe(res =>
{
this.humanFlag = res.val
})
}
在protocolPackService
构造函数中将public
设为component
,以便我们可以在spec
文件中窥探如下:
it('On ngOnInit should assign value as TRUE', () => {
spyOn(component.protocolPackService, 'checkIfHuman').and.returnValue(of({val: true}));
// you dont even need to create this spy because you already have the same value being returned in "PpackServiceStub"
component.ngOnInit();
expect(component.humanFlag).toBeTruthy();
});
it('On ngOnInit should assign value as FALSE', () => {
spyOn(component.protocolPackService, 'checkIfHuman').and.returnValue(of({val: false}));
component.ngOnInit();
expect(component.humanFlag).toBeFalsy();
});
由于您要为ProtocolPackService
创建一个存根,ppackService
,测试期望formatPacks出现在ppackService
中。那就是你已经明确地创建了它。如果您在模块中提供服务,它将用于该模块中导入的所有组件。