Есть несколько способов сделать это:
Подделать импорт в ваш тестовый файл : с помощью jest.mock
Jest будет перехватывать импорти создайте фиктивную версию, когда она используется в файле компонента:
// MyComponent.test.js
import apicall from './AnotherFile'
jest.mock('./AnotherFile');
it('makes API call', () => {
const wrapper = mount(<MyComponent />);
expect(apicall).toHaveBeenCalled();
});
Нет необходимости получать instance
, нет необходимости вручную вызывать componentDidMount
, что произойдет, когдаВы mount(<MyComponent />)
.Примечание: если apicall
должно вернуть значение или обещание, вы можете указать фиктивное значение:
// Mock a response if your componentDidMount calls `apicall.then()`...
apicall.mockImplementation(() => Promise.resolve('some value'));
// Mock a rejected Promise to test error cases
apicall.mockImplementation(() => Promise.reject('Oh no!'));
Внедрение зависимостей: Передайте функцию apicall
в ваш компонент.Вы можете установить по умолчанию значение фактического apicall
, которое вы импортируете, но в тесте вы можете передать фиктивную функцию:
// MyComponent.js
import apicall as realApiCall from './AnotherFile'
class MyComponent extends Component {
static defaultProps = {
apicall: realApiCall
}
componentDidMount() {
// This will call the real apicall if you don't provide
// a prop: <MyComponent /> ... but allows you to inject
// a mock apicall function in tests.
this.props.apicall()
}
<other code ->
}
// MyComponent.test.js
const apicall = jest.fn();
const wrapper = mount(<MyComponent apicall={apicall} />);
expect(apicall).toHaveBeenCalled();