[英]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.