шутка насмешливый импорт машинописного текста в качестве зависимости - PullRequest
0 голосов
/ 26 сентября 2019

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

У меня есть следующий класс

// client.ts
export interface myClient {
  getClient: (customerId: string) => Promise<string>;
}

const impClient = (): myClient => {   

  return {
    getClient: async (customerId: string) => {
     // Implementation
    }
  };
};

export default impClient;

Я пытаюсь подшутить над этим с помощью реализации по умолчанию.Я перепробовал много подходов, включая

 jest.mock('./client', () =>
    jest.fn().mockImplementation(() => {
      return () => {
        return {
          getClient: () => {
            return Promise.resolve('abcde');
          }
        };
      };
    })
  );

, но ни один из них, похоже, не работает.Может кто-нибудь, пожалуйста, пролить свет на это.

1 Ответ

0 голосов
/ 26 сентября 2019

Вот решение:

client.ts:

export interface myClient {
  getClient: (customerId: string) => Promise<string>;
}

const impClient = (): myClient => {
  return {
    getClient: async (customerId: string) => {
      return customerId;
    }
  };
};

export default impClient;

main.ts, использование функции main impClient

import impClient from './client';

export function main(customerId) {
  return impClient().getClient(customerId);
}

main.spec.ts:

import { main } from './main';
import impClient from './client';

jest.mock('./client.ts', () => {
  const mockedClient = {
    getClient: jest.fn()
  };
  return jest.fn(() => mockedClient);
});

const client = impClient();

describe('main', () => {
  afterEach(() => {
    jest.resetAllMocks();
  });
  it('should return client correctly', async () => {
    (client.getClient as jest.MockedFunction<typeof client.getClient>).mockResolvedValueOnce('abcde');
    const customerId = '1';
    const actualValue = await main(customerId);
    expect(actualValue).toBe('abcde');
  });
});

Результат модульного теста со 100% покрытием:

 PASS  src/stackoverflow/58107885/main.spec.ts (9.342s)
  main
    ✓ should return client correctly (4ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 main.ts  |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        12.052s

Вот завершенная демонстрация: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58107885

...