Я пытаюсь провести рефакторинг модульного теста, чтобы изолировать службу, которая вызывает API с использованием ax ios, от компонента, вызывающего службу.
На данный момент служба очень проста:
import axios from 'axios'
export default class SomeService {
getObjects() {
return axios.get('/api/objects/').then(response => response.data);
}
}
Вот фрагмент компонента, который вызывает службу:
const someService = new SomeService();
class ObjectList extends Component {
state = {
data: [],
}
componentDidMount() {
someService.getObjects().then((result) => {
this.setState({
data: result,
});
});
}
render() {
// render table rows with object data
}
}
export default ObjectList
Я могу проверить, что ObjectList отображает данные, как я ожидал, высмеивая ax ios:
// ...
jest.mock('axios')
const object_data = {
data: require('./test_json/object_list_response.json'),
};
describe('ObjectList', () => {
test('generates table rows from object api data', async () => {
axios.get.mockImplementationOnce(() => Promise.resolve(object_data));
const { getAllByRole } = render(
<MemoryRouter>
<table><tbody><ObjectList /></tbody></table>
</MemoryRouter>
);
await wait();
// test table contents
});
});
Все проходит без проблем. В качестве в основном академического c упражнения я пытался выяснить, как имитировать SomeService вместо ax ios, и именно здесь все пошло наперекосяк, потому что я думаю, что недостаточно понимаю внутренности того, что происходит вокруг.
Например, я подумал, поскольку SomeService просто возвращает ответ ax ios, я мог бы аналогичным образом издеваться над SomeService, примерно так:
// ...
const someService = new SomeService();
jest.mock('./SomeService')
const object_data = {
data: require('./test_json/object_list_response.json'),
};
describe('ObjectList', () => {
test('generates table rows from object api data', async () => {
someService.getObjects.mockImplementationOnce(() => Promise.resolve(object_data))
// etc.
Это не срабатывает с ошибкой: Error: Uncaught [TypeError: Cannot read property 'then' of undefined]
, и ошибка восходит к этой строке из ObjectList
:
someService.getObjects().then((result) => {
Что конкретно мне нужно для имитации, чтобы компонент ObjectList
мог получить то, что ему нужно, из SomeService
, чтобы установить его состояние?