spyOn 找不到用于监视 start() 的对象

Posted

技术标签:

【中文标题】spyOn 找不到用于监视 start() 的对象【英文标题】:spyOn could not find an object to spy upon for 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() 找到要监视的对象

【问题讨论】:

【参考方案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); );

以上是关于spyOn 找不到用于监视 start() 的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jasmine 监视值属性(而不是方法)

在角度指令的控制器中测试 $emit

如何使用 jest.spyOn 测试 RTKQuery 端点

角色与间谍的间谍

创建间谍时,Jasmine找不到功能

来自 node_modules 的 Angular 单元测试 spyOn 类