Дразнить импортированные экземпляры классов в Жасмин - PullRequest
2 голосов
/ 05 июля 2019

Я импортирую экземпляр класса из внешней библиотеки и использую непосредственно в члене класса следующим образом:

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';

Я хочу иметь возможность заглушить импортированный экземпляр класса MyClient в моем классе DoStuff приложения-потребителя, но я не уверен, как это сделать.

Я подумывал об использовании ts-mock-import но их примеры, по-видимому, охватывают случаи, когда вы хотите создать новый импортированный класс в классе, с которым вы тестируете.

В моем случае импортированный класс ужеэкземпляр.

Какой здесь правильный подход?

1 Ответ

1 голос
/ 05 июля 2019

Правильный подход - использовать внедрение зависимостей . Никогда не импортируйте экземпляр напрямую, но позвольте Angular внедрить экземпляр. Таким образом, службы легко могут быть подвергнуты мошенничеству, введя проверенную службу .

Вы можете создать оболочку для MyClient в качестве службы для инъекций и позволить Angular внедрять ее в DoStuff. Затем в тестах вы можете сдать издевательский MyClientService.

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

export class DoStuff {
    myClientService: MyClientService;

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

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

мой-клиент-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();
    }
}

См. Также пример в Угловая документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...