类型“””的参数不能分配给类型““ prototype””茉莉的参数

时间:2019-11-21 09:48:06

标签: angular jasmine

更新

似乎具有以下作用:

let gaService = TestBed.get(GAService);

并监视gaService。

我确实在这里完全遗漏了什么。该服务会将数据发送到Google Analytics(分析),因此我必须在测试期间进行模拟。服务本身是:

import { Injectable } from '@angular/core';
import { CoreService} from "./core.service";

@Injectable()
export class GAService {
  constructor(
    public coreService: CoreService
  ) { }

  public sendException (
    description: string,
    isFatal: boolean
  ) : Promise<any> {

    let promise = new Promise((resolve, reject) => {

      (<any>window).ga('send', 'exception', {
        'exDescription': description,
        'exFatal': isFatal
      });
    });

    return promise;
  }

}

它是这样嘲笑的:

import { Injectable } from "@angular/core";
@Injectable()
export class MockGAService {
  constructor() {}

  sendException(
    description: string,
    isFatal: boolean
  ): Promise<any> {
    return Promise.resolve(true);
  }

}

现在在测试期间,我有一个将引发异常的事件,并且我想确保确实调用了sendException,所以我监视了这样的事件:

let preventDefaultSpy = spyOn(
  GAService,
  "sendException"
);

但是它完全不能与以下消息一起编译:

Argument of type '"sendException"' is not assignable to parameter of type '"prototype"'

我编译的唯一方法是:

let preventDefaultSpy = spyOn(
  GAService.prototype,
  "sendException"
);

但是当我这样做时它永远不会被调用

expect(preventDefaultSpy).toHaveBeenCalled();

为了检查,我在模拟程序的sendException()上做了一个控制台输出,它显示了输出,暗示它确实被调用了。

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

茉莉花spyOn将间谍程序安装到现有对象上,但是在您的示例中,您提供了一个类(第一个参数)。

let preventDefaultSpy = spyOn(GAService, "sendException").and.returnValue(Promise.resolve(true));

因此,您的测试可以按以下方式重写(不需要MockGAService):

const service = TestBed.get(GAService);
spyOn(service , "sendException").and.returnValue(Promise.resolve(true));

// do some stuff that is expected to invoke GAService.sendException

expect(service.sendException).toHaveBeenCalled();