Karma Jasmine - 使用组件的服务方法

问题描述 投票:0回答:3

我的组件中有以下代码:

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]
angular karma-jasmine
3个回答
0
投票

根据提到的细节,如果您需要使用formatPacks的原始方法,则需要为该依赖项创建单独的实例,然后在测试中使用它。

试试这个以进行测试

beforeEach(
  "...",
  inject([ProtocolPackService], protoPackService => {
    ppackService = jasmine.createSpyObj("ProtocolPackService", {
      listPacks: () => {},
      findPackDevices: () => {},
      formatPacks: packs => {
        protoPackService.formatPacks(packs);
      },
    });
  }),
);

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种不同的服务行为,然后您需要创建一个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();    
  });


0
投票

由于您要为ProtocolPackService创建一个存根,ppackService,测试期望formatPacks出现在ppackService中。那就是你已经明确地创建了它。如果您在模块中提供服务,它将用于该模块中导入的所有组件。

© www.soinside.com 2019 - 2024. All rights reserved.