Как переписать метод возврата в got.post() (используя jest mock), чтобы я мог вызывать метод json

#typescript #jestjs #ts-jest

#typescript #jestjs #ts-jest

Вопрос:

Я пытаюсь использовать jest для тестирования моего скрипта (typescript)

 // api.ts
import got from "got";


export const run = async () => {
  const body = await got.get('https://jsonplaceholder.typicode.com/posts/1').json();
  return body;
};
  

и мой тест

 // api.test.ts
import { run } from "../api";
import got from "got";
import { mocked } from "ts-jest/dist/util/testing";

jest.mock("got");

test("using another got", async () => {
  const response = {
    get: jest.fn(),
  };
  mocked(got).mockResolvedValue(response);

  const result = await anotherGot();
  console.log(result);
  // expect(result).toBe(response.body);
});
  

когда я пытаюсь запустить тест ( npm test )
Я получил ошибку

 TypeError: Cannot read property 'json' of undefined
  

Как обрабатывать код в jest test?

Ответ №1:

Вы пытаетесь издеваться над самой функцией got (которая также является функцией). Но вам нужно издеваться над got.get функцией.

Вполученном пакете npm реализовано 2 способа вызова HTTP-запроса GET:

  1. const response = got('http://google.com', { method: 'get' });
  2. const response = got.get('http://google.com');

Поэтому, если вы хотите издеваться над своим, got.get(...) вам нужно будет издеваться got.get , а не got над самим собой (вариант использования # 2):

 // api.test.ts
// import { run } from "../api";
import got from "got";
import { mocked } from "ts-jest/utils";

jest.mock("got");

test("using another got", async () => {
    const mockedGot = mocked(got);

    // use case #1 - using got module directly
    mockedGot.mockReturnValue({
        json: () => Promise.resolve({ dataAttr1: 'val11111' }),
    } as any)

    const response1 = got('http://www.google.com', { method: 'get' });
    const data1 = await response1.json();
    expect(data1).toEqual({ dataAttr1: 'val11111' })

    /*******************************************************************/

    // use case #2 - using got.get "alias"
    // this is your case :)
    mockedGot.get = jest.fn().mockReturnValue({
        json: () => Promise.resolve({ dataAttr1: 'val22222' }),
    } as any);

    const response2 = got.get('http://www.google.com');
    const data2 = await response2.json();
    expect(data2).toEqual({ dataAttr1: 'val22222' })
});