簡體   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