Как разрешить частичные типы TypeScript при насмешливых функциях - Jest, TypeScript - PullRequest
1 голос
/ 14 мая 2019

У меня есть функция, которую я хотел бы использовать для тестирования в TypeScript. В моих тестах все, что меня волнует, это json и status. Однако при использовании Jest's jest.spyOn тип моей смоделированной функции устанавливается так, чтобы он возвращал тип http Response. Это неудобно, так как это означает, что мне нужно вручную перейти к реализации множества функций и свойств, которые не имеют отношения к делу и являются произвольными.

Я подозреваю, что здесь есть какой-то способ использовать частичный тип, чтобы обеспечить более качественное и полезное моделирование путем переопределения возвращаемого типа только для того, что меня волнует. Как бы я поступил так?

export function mockApi(json: object, status: number): void {
  jest.spyOn(
    myApiModule,
    'methodWhichReturnsAResponse'
  ).mockImplementation(() =>
    Promise.resolve({
      json: () => Promise.resolve(json),
      status,
      // Below here is to appease jest types (not needed for
      // testing purposes at the time of writing)
      headers: {
        has: (name: string) => true,
        // get, set, etc...
      },
      ok: true,
      redirected: false,
      // and about 10 other properties which exist on the Response type
      // ...
    }),
  );
}

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Вы можете использовать as ...

export function mockApi(json: object, status: number): void {
  jest.spyOn(
    myApiModule,
    'methodWhichReturnsAResponse'
  ).mockImplementation(() =>
    Promise.resolve({
      json: () => Promise.resolve(json),
      status
    } as http.Response), // <-- here
  );
}

Ключевое слово as, используемое для приведения типов, когда используется для преобразования литерала в тип X, позволит вам определить его только частично, но у вас все еще есть проверка типов, потому что вы не можете определить реквизиты, которые не существуют.

Пример:

type X {
  a: number
  b: number
}

const x = { a: 2 } as X // OK
const y = { a: 3, c: 2 } as X // NOT OK, because c does not exist in X
0 голосов
/ 14 мая 2019

Я нашел решение, используя тип unknown.

После попытки и невозможности использовать as для немедленной типизации, я сначала приводил обещание к unknown, а затем приводил это значение к желаемому типу Response следующим образом:

    // ...
    .mockImplementation(() => {
      const httpResponsePromise = Promise.resolve({
        json: () => Promise.resolve(json),
        status,
      }) as unknown;
      return httpResponsePromise as Promise<Response>;
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...