Я пытаюсь смоделировать console.info
, который, как я знаю, будет вызываться при запуске импортированной функции. Функция полностью состоит из одного fetch
, который, когда не работает в рабочей среде, сообщает о запросе и ответе, используя console.info
.
На вопрос Шутка. Как смоделировать консоль, когда она используется сторонней библиотекой? , самый популярный ответ предлагает перезаписать global.console
, поэтому я использую jest.spyOn
, чтобы попробовать это:
import * as ourModule from "../src/ourModule";
test("Thing", () => {
// Tested function requires this. Including it here in case it's causing
// something quirky that readers of this question may know about
global.fetch = require("jest-fetch-mock");
const mockInfo = jest.spyOn(global.console, "info").mockImplementation(
() => { console.error("mockInfo") }
);
ourModule.functionBeingTested("test");
expect(mockInfo).toHaveBeenCalled();
}
Как и ожидалось, вывод содержит экземпляр «mockInfo». Однако затем выполнить проверку с помощью toHaveBeenCalled()
не удалось.
expect(jest.fn()).toHaveBeenCalled()
Expected mock function to have been called, but it was not called.
40 |
41 | ourModule.functionBeingTested("test");
> 42 | expect(mockInfo).toHaveBeenCalled();
| ^
43 |
at Object.toHaveBeenCalled (__tests__/basic.test.js:42:22)
console.error __tests__/basic.test.js:38
mockInfo
Я пытался переместить spyOn
до загрузки модуля, как это предлагается в одном из комментариев к ответу, без различий в результате. Что мне здесь не хватает?
Вот эта функция:
function functionBeingTested(value) {
const fetchData = {
something: value
};
fetch("https://example.com/api", {
method: "POST",
mode: "cors",
body: JSON.stringify(fetchData),
})
.then( response => {
if (response.ok) {
if (MODE != "production") {
console.info(fetchData);
console.info(response);
}
} else {
console.error(`${response.status}: ${response.statusText}`);
}
})
.catch( error => {
console.error(error);
});
}