Я реализую интернационализацию в реагирующем приложении с библиотекой react-intl. Язык может запускаться в разных компонентах, поэтому я использовал библиотеку pubsub-js для публикации события каждый раз. когда язык меняется, и подпишитесь на это событие в моем центральном компоненте приложения, который затем переключает язык и сообщения, отображаемые во всем приложении.
Мой вопрос касается написания тестов с помощью jest и enzyme, который вызовет смену языка и обновит компонент моего приложения с помощью языка, поэтому я могу утверждать, что переменные состояния, связанные с локалью, обновлены правильно. Можно ли инициировать такие события, или я на неправильном пути? Мой код указан ниже
//Relevant parts of the app component
class App extends Component {
constructor(props) {
super(props);
this.localeStore = new LocaleStore();
this.state = {
locale: this.localeStore.locale(),
messages: this.localeStore.messages()
};
}
componentDidMount() {
PubSub.subscribe(LocaleEvent.change, (event, locale) => {
this.setState({locale: locale.code, messages: locale.messages})
});
}
componentWillUnmount() {
PubSub.unsubscribe(LocaleEvent.change);
}
render() {
return (
<IntlProvider key={ this.state.locale } locale={ this.state.locale } messages={ this.state.messages }>
<div>
...
</div>
</IntlProvider>
);
}
}
// App.test.js
describe('App', () => {
it('renders without crashing', () => {
const div = document.createElement('div');
mount(<App />);
});
// This test fails, because the event is not published and the state does not change
it('correctly switches the language when the language change event is triggered', () => {
let app = mount(<App />);
PubSub.publish('locale.change', {code: 'en', messages: {}});
expect(app.state().locale).toEqual('en');
});
});
PubSub
импортирован в ваш модуль или происходит из глобального пространства имен? - person Andreas Köberle   schedule 17.05.2017