Тестирование TypeScript с помощью Jest: «этому вызову не соответствует ни одна перегрузка» - PullRequest
1 голос
/ 26 мая 2020

Я работаю над тестированием сервера Apollo RESTDataSource с помощью Jest. Мое приложение написано на TypeScript. Мой класс CDCDataSource расширяет абстрактный класс RESTDataSource , который сам расширяет абстрактный класс DataSource. RESTDataSource имеет метод get, который позволяет извлекать данные из внешнего источника данных REST. Я использую sh для имитации этого метода, поскольку я использую sh для имитации внешнего источника данных.

  protected async get<TResult = any>(
    path: string,
    params?: URLSearchParamsInit,
    init?: RequestInit,
  ): Promise<TResult> {
    return this.fetch<TResult>(
      Object.assign({ method: 'GET', path, params }, init),
    );
  }

Однако, когда я пытаюсь издеваться над этим методом, используя spyOn Jest - после второго ответа здесь: Jest: Как издеваться над одним конкретным c методом класса -

import CDCDataSource from '../CDCDataSource';

test('Test', () => {
    let dataSource = new CDCDataSource();
    let spy = jest.spyOn(dataSource, 'get').mockImplementation(() => 'Hello');
    expect(dataSource.get()).toBe('Hello');


Однако я получаю ошибку TypeScript

TS2768: нет перегрузки, соответствующей этому вызову

вместо get в jest.spyOn(dataSource,'get')

, и я получаю

enter image description here

вместо get в

expect(dataSource.get()).toBe('Hello');

Таким образом, может показаться, что часть проблемы заключается в том, что это метод защиты - я не понимаю, как протестировать этот метод, чтобы иметь возможность имитировать API.

My tsconfig.json is

{
  "compilerOptions": {
    "target": "ES6",
    "lib": [
      "esnext",
      "dom"
    ],
    "skipLibCheck": true,
    "outDir": "dist",
    "strict": false,
    "forceConsistentCasingInFileNames": true,
    "esModuleInterop": true,
    "module": "commonjs",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "sourceMap": true,
    "alwaysStrict": true,
  },
  "exclude": [
    "node_modules"
  ]
}

Это проект Node Apollo Server (с использованием Node 12.14.0 и TypeScript 3.8.3)

Спасибо за любые подсказки!

1 Ответ

2 голосов
/ 26 мая 2020

Вы пытаетесь получить доступ к методу protected.

Если вы не хотите или не можете изменить архитектуру своего класса, вы можете использовать ts-ignore для подавления ошибки.

    // @ts-ignore`
    let spy = jest.spyOn(dataSource, 'get').mockImplementation(() => 'Hello');

Или вы можете расширить исходный класс с помощью класс, созданный только для тестирования, у которого будет метод publi c, который будет просто прокси для защищенного метода.

test('Protected method',()=>{

  class Test extends OriginalClass {
    testProtected(){
      super.protectedMethod()
    }
  }
  let dataSource = new Test();
  let spy = jest.spyOn(dataSource, 'testProtected').mockImplementation(() => 'Hello');
})
...