Новое в 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));
}
}
};