业力茉莉花-使用组件中的服务方法

时间:2019-04-24 08:30:33

标签: angular karma-jasmine

我的组件中包含以下代码:

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]

4 个答案:

答案 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();    
  });