Jasmine期待间谍被召唤

Aj1*_*Aj1 7 jasmine angularjs typescript karma-jasmine

这是我用打字稿写的角度工厂:

export class DataService { 

constructor () {
   this.setYear(2015);
 }
setYear = (year:number) => {
        this._selectedYear =year;
     }
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试文件.

 import {DataService } from ' ./sharedData.Service';
 export function main() {
    describe("DataService", () => {
        let service: DataService;
        beforeEach(function () {
            service = new DataService();
        });

        it("should initialize shared data service", () => {
            spyOn(service, "setYear");
            expect(service).toBeDefined();
            expect(service.setYear).toHaveBeenCalled(2015);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

当我运行该文件时,测试失败了

**Expected spy setSelectedCropYear to have been called.
Error: Expected spy setSelectedCropYear to have been called.**
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚出了什么问题.任何人都可以告诉我测试有什么问题.

小智 6

问题是您设置间谍太晚了。在您将间谍安装到服务中时,它已经构造好并已调用setYear。但是您显然无法在构造间谍之前将其安装在服务上。

解决此问题的一种方法是监视DataService.prototype.setYear。您可以确保服务实例断言了它,

Dataservice.prototype.setYear.calls.mostRecent().object is service.


Aj1*_*Aj1 0

修复了这里的问题是更新的测试。

import {DataService } from ' ./sharedData.Service';
 export function main() {
    describe("DataService", () => {
        let service: DataService;
        beforeEach(function () {
            service = new DataService();
        });

        it("should initialize shared data service", () => {
           var spy = spyOn(service, "setYear").and.callThrough();
            expect(service).toBeDefined();
            expect(spy);
            expect(service._selectedYear).toEqual(2015);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)