【问题标题】:Resolved Promises inside AngularJS Unit-Test not working with Jasmine spyOn解决了 AngularJS 单元测试中的 Promise 不适用于 Jasmine spyOn
【发布时间】:2016-01-26 22:52:42
【问题描述】:

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

来源:

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 承诺对象,.then 方法中的回调函数也不会被调用。源代码在正常运行时很好,但在使用 jasmine 的 spyOn 的单元测试中执行时出现错误。

【问题讨论】:

    标签: angularjs unit-testing mocking jasmine promise


    【解决方案1】:

    在解决承诺后使用 $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);
    })
    

    【讨论】:

    • 谢谢,它有效。请告诉我为什么?有替代方案吗?我们不想在我们所有的测试规范中调用 $scope.$digest。
    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多