Используя jest, вы можете смоделировать части mobx для создания собственного хранилища, поэтому вместо запуска реальной функции инъекции вы можете вместо этого предоставить собственную функцию инъекции.
Используя эту пользовательскую функцию инъекции, вы можете вернуть подделкуstore (который должен совпадать с тем же интерфейсом, что и исходное хранилище).
Если вы хотите предварительно заполнить хранилище значениями, импортировав созданный макет (jest не допускает переменных в модуле / глобальной области видимостидля использования при использовании jest.mock)
Вот пример кода, который достигает этого (это непроверенный код, написанный прямо здесь, на stackoverflow, поэтому для правильной настройки могут потребоваться некоторые настройки).
jest.mock('mobx-react', () => {
// get the original reference to mobx-react
const originalMobx = require.requireActual('mobx-react');
// create your fake stores, they should have the same interface as the real store
const mockStores = {
userStore: new UserStore()
};
return {
...originalMobx, // allow to import the original properties in react-mobx
// override the inject decorator to instead return the fake store as a prop
inject: (injectName) => (component) => (props) => {
// render the real component with the additional prop
return react.createElement(component, {...props, [injectName]: mockStores[injectName] })
},
mockStores // Allows access afterwards via import e.g import { mockStores } from 'mobx-react'
}
});
После того, как вы высмеяли функцию ввода mobx-реагировать, вы можете обратиться к хранилищу, чтобы предварительно заполнить значения:
import { mockStores } from 'mobx-react';
test('my test', () => {
mockStores.userStore.clearUsers();
// render the component here
})
Существует также альтернативное решение, где вы можете просто обернуть тестируемый компонент с помощью Provider
от mobx-react
и поставка поддельных магазинов.
, поэтому тест предварительно их инициализирует и передает контекст.
Например,
test('my comp', () => {
const userStore = new UserStore();
const component = shallow(
<Provider userStore={userStore}>
<MyComponent />
</Provider>
)
});