当前位置: 首页 > 知识库问答 >
问题:

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

邴英毅
2023-03-14

这是我想用typescript中的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)

我希望取消方法中的getJobs调用被模拟并返回一个作业对象。

但是这次考试并没有按照我的预期进行。Mock不会出现在图片中,getJob()进入实际实现并返回未定义的。

我在网上读到,这个问题是因为ClassAResource类中的构造函数初始化。

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

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

有没有一些变通方法,通过它我可以模拟getJobs()与构造函数到位?

我是不是做错了什么?

我对typescript和ts mockito比较陌生,非常感谢您的帮助。

共有1个答案

冷翼
2023-03-14

这实际上与TypeScript无关,而是由于打破了依赖性反转原则而导致的可测试性问题
在类的构造函数中实例化成员会导致可测试性问题,因为实例化的控制权掌握在被测代码手中(也称为“被测单元”、“被测类”等)。这意味着,您几乎无法控制要测试的类将拥有哪个实例。

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

不要从ClassA的构造函数实例化IClassAResource,而应该通过注入(DI、构造函数、setter方法等)获取实例,或者至少使用工厂/生成器。这样,您的类将变得可测试,您的设计也将得到改进。

一般来说,您应该坚持所有坚实的原则,因为至少在目前,这些原则被认为是最准确、最简洁的一套优秀OOP设计原则。

 类似资料:
  • 问题内容: 我正在为具有两个方法methodA,methodB的类编写JUnit测试用例。我想在测试用例中模拟对methodA的methodB调用,我正在对正在测试的类使用间谍,但仍然执行methodB。 这是课程 这是测试课 尽管我已对其进行了模拟,但方法B仍会得到调用。请向我建议一个使用正确方法模拟同一类methodA的methodB调用的解决方案。 问题答案: 我昨天碰到这个,因为间谍最好做

  • 问题内容: 我想将数据存储在ArrayList中并在另一个类中访问它,但是当我访问时,它是0。意味着我没有访问相同的arraylist。有人告诉我我做错了。 这是我的POJO课 这是我将数据存储在 A类中的方法 , 该类 已经过检查,已成功将其插入到arraylist中。 A级 问题出在 B类中, 当我访问它的返回值0时,意味着我没有访问相同的arraylist。 这是我在 B类中* 所做的 *

  • 问题内容: 我正在寻找类似于Objective-C的class方法的行为,因为该方法在类初始化时被调用一次,此后不再被调用。 一个简单的闭合将非常时尚!而且很显然,当我们在结构闭包中使用“ s”而不是“ s”时,这一切都将非常匹配! 问题答案: 如果您有一个Objective-C类,最简单的方法就是重写。但是,请确保您的类的 子 类也被覆盖,否则您的类的 子 类可能会被多次调用!如果需要,可以使用

  • 问题内容: 我试图创建Hibernate Validator bean,并遇到从另一个类中的静态工厂方法创建bean的问题。我找到了一种初始化我的Validator bean的Spring方法(底部是解决方案),但是问题本身仍然没有解决。验证器在此处用作示例案例。 这就是我用Java创建Validator实例的方式 这就是我尝试在applicationContext.xml中创建bean的方式 我

  • 简而言之,我创建了一个类Something witch具有一个带有JFrame的函数,其中我有一个标签和一个按钮。在按钮上有一个addActionListener(new changeLabel())。我在src包中为侦听器类了changeLabel,但当我启动应用程序并单击按钮时,在changeLabel上抛出一个NullPointerException NameLabel.setText(“N

  • 下面是从测试中的类调用的类的代码示例 所以我的问题是如何成功地模拟CodeWithAnotherPrivateMethod类的doTheGamble()方法,使其始终返回true?