更新:
似乎具有以下作用:
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()上做了一个控制台输出,它显示了输出,暗示它确实被调用了。
我在做什么错了?
答案 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();