首页 > 解决方案 > 无法使用 jasmine 断言嵌套方法调用

问题描述

我正在尝试使用 jasmine 为我的 angular5 Web 应用程序编写单元测试。

代码分为 3 个文件,即utilityFile.ts,component.tscomponent.spec.ts

实用程序文件.ts:

export class UtilityFile{
     constructor(){}
     parse(){
         // do somthing
     }
}

组件.ts:

export class Component{
    uf = new UtilityFile();
    constructor(){}
    runParse(){
        uf.parse(); // <-- trying to test if this method has been called
    }
}

组件.spec.ts:

describe('test runParse()',()=>{
    let comp:Component;
    beforeAll(()=>{
        comp = new Compnent();
        comp.runParse();
    })
    it('should call uf.parse()', ()=>{
        spyOn(comp.uf, 'parse');
        expect(comp.uf.parse).toHaveBeenCalled(); // <-- test fails
    })
})

相关包:

"@types/jasmine": "~2.8.3",
"@types/jasminewd2": "~2.0.2",
"jasmine-core": "~2.8.0",
"jasmine-spec-reporter": "~4.2.1",
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2",

我感谢每一个提示。

标签: angularunit-testingangular5karma-jasmine

解决方案


将您的移动spybeforeAll块,您调用的位置runParse()。因为首先runParse()调用uf.parse(),当时没有spy创建需要提防。所以spy应该在它被调用之前创建。

describe('test runParse()',()=>{
    let comp:Component;
    beforeAll(()=>{
        comp = new Compnent();
        spyOn(comp.uf, 'parse');   // create spy before calling runParse()
        comp.runParse();
    })
    it('should call uf.parse()', ()=>{
        expect(comp.uf.parse).toHaveBeenCalled(); // should pass now
    })
})

推荐阅读