繁体   English   中英

如何模拟使用ts Mockito在Typescript中的另一个类中初始化的类方法?

[英]How to mock a class method's which is initialized inside another class in typescript using ts mockito?

这是我要在打字稿中使用mocha-chai测试框架进行测试的班级。 我正在使用ts-mockito进行模拟。

export class ClassA implements IClassA {

    private classAResource: IClassAResource;

    constructor(){
         this.classAResource= new ClassAResource();
    }

    public async cancel(jobid){
       const job = this.classAResource.getJob(jobid);
       //cancel logic
    }
}

ClassAResource类看起来像这样,

export class StreamResource implements IStreamResource {

private jobs: Map<string, Job>;

 constructor(){
 this.jobs= new Map();
 }

public async createJob(): Promise<Job> {
//add the job to map
}

public async getJob(jobid): Promise<Job>{
//return the specified job item from map
}


}

在我的测试中,我尝试像这样模拟ClassAResource的getJob方法,

const classAResource: IClassAResource = new ClassAResource ();
 const classAResourceSpy = spy(classAResource);

 when(classAResourceSpy.getJob(anyString())).thenResolve(job); 

我这样调用ClassA cancel方法,

classA.cancel(jobid)

我希望对cancel方法中的getJob调用进行模拟并返回作业对象。

但是测试没有按照我的预期进行。 模拟不会出现,并且getJob()进入实际实现并返回未定义。

我在网上阅读,这个问题是由于ClassAResource类中的构造函数初始化引起的。

我删除了构造函数并尝试过,现在getJob模拟工作了。

但是我需要构造函数实例化map对象和维护作业的能力。

有一些变通办法,可以通过它在构造函数到位的情况下模拟getJob()吗?

我在这里做错什么了吗?

我对打字稿和ts-mockito还是比较陌生,对您的帮助非常感谢。

实际上,这确实与TypeScript无关,而是由于违反了Dependency Inversion原理而导致的可测试性问题。
在类的构造函数中实例化成员会导致可测试性问题,因为对实例化的控制权在被测代码(也称为“被测单元”,“被测类”等)的手中。 这意味着,您几乎无法控制要测试的类具有哪个实例。

有一些模拟库允许某些类的实例的“恶意接管”(至少对于Java,请参阅PowerMock ),但是应该使用它们(如果有的话)非常谨慎,因为它们会导致缺乏可测试性。

代替从ClassA的构造函数实例化IClassAResource ,您应该通过注入(DI,构造函数,setter方法等)获取实例,或者至少使用工厂/构造器。 这样,您的班级将成为可测试的,并且您的设计将得到改善。

通常,您应该遵守所有SOLID原则,因为至少在目前,它们被认为是最准确,最简洁的一组良好的OOP设计原则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM