监视从组件的构造函数调用的方法

Posted

技术标签:

【中文标题】监视从组件的构造函数调用的方法【英文标题】:Spying on a method which is being called from the component's constructor 【发布时间】:2018-03-31 13:04:43 【问题描述】:

我是单元测试新手,我的项目中有一个组件,在其构造函数中调用了一个方法

export class myComponent 
constructor()       
        this.someMethod();
   

public someMethod()
 //some code

我想测试这个方法是否被这个测试套件调用:

it('should call for the someMethod', () => 
    spyOn(component, 'someMethod')   //also tried .and.callThrough();

    expect(component.someMethod).toHaveBeenCalled();;
);

问题是在我的调试过程中,我可以确保调用了该方法,但测试总是会失败。

如果有人提供帮助,将不胜感激。

【问题讨论】:

【参考方案1】:

正如this answer 中所解释的,使用原型方法的好处之一是它们可以在类实例化之前被监视或模拟。考虑到这是导出了控制器类的 TypeScript 代码,它是:

it('should call for the someMethod', () => 
    spyOn(ComponentClass.prototype, 'someMethod');
    // instantiate ComponentClass class
    expect(component.someMethod).toHaveBeenCalled();
);

让构造函数包含初始化逻辑通常是一个坏习惯,特别是因为这会使类更难测试和扩展。由于 AngularJS 已经提供了控制器挂钩,因此最好将所有初始化逻辑移至 $onInit,除非存在与生命周期相关的计时问题。

【讨论】:

以上是关于监视从组件的构造函数调用的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jasmine 1 中监视 Falcor 数据模型构造函数

从构造函数调用的异步方法[重复]

如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]

Angular 组件构造函数被调用两次

从 ViewModel 构造函数 Xamarin.Forms 调用异步方法

为啥从类构造函数调用的方法应该是最终的? [复制]