AngularJS 单元测试中已解决的 Promises 不适用于 Jasmine spyOn

Resolved Promises inside AngularJS Unit-Test not working with Jasmine spyOn

我对以下源代码和相应的单元测试有疑问:

来源:

public laufeVorwaertsUndZurueck(laenge:number):ng.IPromise<any>{
 return this.ev3DifferentialPilotAdapterService.run(laenge)
    .then((response:any)=> {
        return this.ev3DifferentialPilotAdapterService.rotate(180);
    })
    .then((response:any)=> {
         return this.ev3DifferentialPilotAdapterService.run(laenge);
    })
    .then((response:any)=> {
        return this.ev3DifferentialPilotAdapterService.rotate(180);
    });
    console.log("done");
}

单元测试:

it("laufe 60cm vorwärts und laufe wieder zurück", () =>{
    var promise = qService.resolve("resolved");
    console.log(promise);
    spyOn(ev3DifferentialPilotAdapterService, "run").and.returnValue(promise);
    spyOn(ev3DifferentialPilotAdapterService, "rotate").and.returnValue(promise);

    baseBallAktionenService.laufeVorwaertsUndZurueck(60);
    expect(ev3DifferentialPilotAdapterService.run).toHaveBeenCalledWith(60);
    expect(ev3DifferentialPilotAdapterService.run).toHaveBeenCalledTimes(2);
    expect(ev3DifferentialPilotAdapterService.rotate).toHaveBeenCalledWith(180);
    expect(ev3DifferentialPilotAdapterService.rotate).toHaveBeenCalledTimes(2);
})

即使我传递了一个 resolved promise 对象,.then 方法中的回调函数也永远不会被调用。当 运行 正常时,Source 是好的,但在使用 jasmine 的 spyOn 的单元测试中执行时表现错误。

解决承诺后使用 $digest。

见下文..

it("laufe 60cm vorwärts und laufe wieder zurück", () =>{
    spyOn(ev3DifferentialPilotAdapterService, "run").and.returnValue(promise);
    spyOn(ev3DifferentialPilotAdapterService, "rotate").and.returnValue(promise);

    baseBallAktionenService.laufeVorwaertsUndZurueck(60);

    var promise = qService.resolve("resolved");
    $scope.$digest();

    expect(ev3DifferentialPilotAdapterService.run).toHaveBeenCalledWith(60);
    expect(ev3DifferentialPilotAdapterService.run).toHaveBeenCalledTimes(2);
    expect(ev3DifferentialPilotAdapterService.rotate).toHaveBeenCalledWith(180);
    expect(ev3DifferentialPilotAdapterService.rotate).toHaveBeenCalledTimes(2);
})