我的组件中包含以下代码:
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]
答案 0 :(得分:0)
如果您模拟了protocolPackService,则必须监视formatPacks,否则它将起作用。请分享您为此编写的测试。
答案 1 :(得分:0)
根据上述详细信息,如果您需要对formatPacks
使用原始方法,则需要为该依赖关系创建一个单独的实例,然后在测试中使用它。
尝试一下进行测试
beforeEach(
"...",
inject([ProtocolPackService], protoPackService => {
ppackService = jasmine.createSpyObj("ProtocolPackService", {
listPacks: () => {},
findPackDevices: () => {},
formatPacks: packs => {
protoPackService.formatPacks(packs);
},
});
}),
);
答案 2 :(得分:0)
由于您正在为ProtocolPackService创建一个存根(即ppackService),因此测试期望formatpacks存在于ppackService中。那就是您已经明确创建了它。 如果您在模块中提供服务,它将在该模块中导入的所有组件中使用。
答案 3 :(得分:0)
好的,所以方法的问题是您需要使用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种不同的service行为,那么您需要创建一个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();
});