Как мне высмеивать инициализацию состояния конструктора с помощью Jest? - PullRequest
1 голос
/ 15 марта 2019

Новое в node.js.Я пишу JS API-клиент, который упаковывает основную библиотеку axios .В модульных тестах я использую Jest .

. В конструкторе моего класса API я передаю URL и использую функцию axios.create, чтобысоздайте пользовательский экземпляр axios и привяжите его к свойству client.

Проблема возникает, когда я высмеиваю зависимость axios с помощью jest.mock('axios') - В тесте выдается ошибка TypeError при попытке вызватьaxios.get:

TypeError: Cannot read property `get` of undefined

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

Код клиента и тестирование ниже:


client.js

jest.mock("axios");
const axios = require("axios");
const mockdata = require("./mockdata");
const ApiClient = require("../../../src/clients/apiclient");


const BASE_URL = "https://www.mock.url.com"

const mockAxiosGetWith = mockResponse => {
  axios.get.mockResolvedValue(mockResponse);
};

test("should make one get request",  async () => {
  mockAxiosGetWith(MOCK_RESPONSE)

  // the client field in apiclient is undefined
  // due to the jest module mocking of axios
  const apiclient = new ApiClient.AsyncClient(BASE_URL);


  // TypeError: Cannot read property `get` of undefined
  return await apiclient.get("something").then(response => {
    expect(axios.get).toHaveBeenCalledTimes(1);
  });

});

client.test.js

const axios = require("axios");

const getClient = (baseUrl = null) => {
  const options = {
    baseURL: baseUrl
  };

  const client = axios.create(options);

  return client;
};

module.exports = {
  AsyncClient: class ApiClient {
    constructor(baseUrl = null) {
      this.client = getClient(baseUrl);
    }

    get(url, conf = {}) {
      return this.client
        .get(url, conf)
        .then(response => Promise.resolve(response))
        .catch(error => Promise.reject(error));
    }

  }
};

1 Ответ

5 голосов
/ 15 марта 2019

Вам нужно смоделировать axios, чтобы он возвратил объект, содержащий функцию create, которая должна вернуть объект с get

import axios from 'axios'
jest.mock('axios', () => ({create: jest.fn()}))


test("should make one get request",  async () => {
  const get = jest.fn(()=>Promise.resolve(MOCK_RESPONSE))
  axios.create.mockImplementation(()=>({get}))

  const apiclient = new ApiClient.AsyncClient(BASE_URL);

  await apiclient.get("something")
  expect(get).toHaveBeenCalledTimes(1);

});

...