在Jasmine中模拟导入的类实例

时间:2019-07-05 11:16:31

标签: angular typescript jasmine

我正在从外部库导入类实例,并像这样直接在类成员中使用

import { MyClient } from '@foo/bar';

export class DoStuff {

    public getStuff = () => {
        return MyClient.fetchThings();
    }
}

我要从中导入此类的库,将类导出为:

// my-client.ts

class MyClient {
  //stuff
  async fetchThings() {
  }
}

export const myClient =  new MyClient();

-----

// index.ts

export {
  myClient as MyClient,
} from './my-client';

我希望能够在正在使用的应用程序的DoStuff类中存入导入的MyClient类实例,但是我不确定该怎么做。

我当时正在考虑使用ts-mock-imports,但它们的示例似乎涵盖了您想在要测试的类中新建一个导入类的情况。

就我而言,导入的类已经是一个实例。

这里正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

正确的方法是使用dependency injection。永远不要直接导入实例,而是让Angular注入实例。这样一来,服务可以轻松mocked by injecting the mocked service

您可以在MyClient上创建包装器作为可注入服务,并让Angular将其注入到DoStuff中。然后,在测试中,您可以通过mocked MyClientService

import { MyClientService } from './my-client-service';

export class DoStuff {
    myClientService: MyClientService;

    constructor(myClientService) {
        this.myClientService = myClientService;
    }

    public getStuff = () => {
        return this.myClientService.fetchThings();
    }
}

my-client-service.ts:

import { Injectable } from '@angular/core';
import { MyClient } from '@foo/bar';

@Injectable({
    providedIn: 'root',
})
export class MyClientService {
     myClient: MyClient;

    constructor() {
        this.myClient = MyClient;
    }

    fetchThings() {
        return this.myClient.fetchThings();
    }
}

另请参见Angular documentation

中的示例