【问题标题】:spyOn could not find an object to spy upon for start()spyOn 找不到用于监视 start() 的对象
【发布时间】:2017-02-27 15:24:53
【问题描述】:

我正在使用 angular-cli 测试框架。

在我的组件中,我使用了“ng2-slim-loading-bar”节点模块。

submit(){
    this._slimLoadingBarService.start(() => {
    });
    //method operations
}

现在当我测试这个组件时,我已经将 spyOn 这个服务应用为:

beforeEach(() => {
    let slimLoadingBarService=new SlimLoadingBarService();
    demoComponent = new DemoComponent(slimLoadingBarService);
    TestBed.configureTestingModule({
        declarations: [
            DemoComponent
        ],
        providers: [
            { provide: SlimLoadingBarService, useClass: SlimLoadingBarService}
        ],
        imports: [
            SharedModule
        ]
    });
});
it('should pass data to servie', () => {
    spyOn(slimLoadingBarService,'start').and.callThrough();
   //testing code,if I remove the above service from my component, test runs fine
});

但它不起作用。

它抛出以下错误:

spyOn 无法为 start() 找到要监视的对象

【问题讨论】:

    标签: javascript angular typescript jasmine angular2-testing


    【解决方案1】:

    使用 let 声明 slimLoadingBarService,您将其范围限制为 beforeEach 回调范围。用 var 声明它,或者更好,在正确的 describe() 块之后声明它,并在 beforeEach 回调函数中设置它的内容:

    describe("some describe statement" , function(){
        let slimLoadingBarService = null;
    
        beforeEach( () => {
            slimLoadingBarService=new SlimLoadingBarService();
    
        });
    
        it('should pass data to service', () => {
            spyOn(slimLoadingBarService,'start').and.callThrough();
           //testing code,if I remove the above service from my component, test runs fine
        });
    });
    

    【讨论】:

    • +1。您可以使用slimLoadingBarService = TestBed.inject(SlimLoadingBarService);(对于Angular 9)在beforeEach 中注入该服务,而不是那里的行。为了利用打字稿,您可以在描述之后将变量定义为let mockSlimLoadingBarService: SlimLoadingBarService;,以便输入。您必须创建一个名为 SlimLoadingBarService 的接口,并可能将其放在一个 slim-loading-bar-service.model.ts 文件中,但它有助于使事情井井有条,并且可以在错误发生之前将其清除。
    【解决方案2】:

    这是由于 beforeEach 中没有声明

    angular 10 之后的更新语法

    beforeEach(() => {
        slimLoadingBarService = TestBed.get(SlimLoadingBarService);
    });
    

    角度 10 之前

    beforeEach(() => {
        slimLoadingBarService = TestBed.get(SlimLoadingBarService);
    });
    

    【讨论】:

    • 从 Angular 10 开始,TestBed.inject(<class-name>) 是语法。
    • beforeEach(() => { slimLoadingBarService = TestBed.get<SlimLoadingBarService>(SlimLoadingBarService); });
    猜你喜欢
    • 2017-11-30
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多