Я пытаюсь выполнить модульное тестирование обработки сообщений клиента websocket для компонента. Этот компонент подписывается на темы с указанием обработчика c для каждой топи c. Я пытаюсь убедиться, что когда пришло «обновление», вызывается обработчик и сообщение обрабатывается соответствующим образом.
Я пробовал jest-websocket-mock, но не могу отправить сообщение для топи c, поэтому я не могу проверить, вызывается ли этот обработчик или нет. Нужно ли мне делать что-то еще, или мой подход к модульному тестированию этого компонента был неправильным?
Ниже представлен компонент, который я тестирую, и тестовый файл.
Home. js
....
import WSConn from '.../components/WsConn'; // this component handle the actual logic setting up the connection to the mqtt broker using Paho javascript
class Home extends PureComponent {
constructor(){
....
this.wsRef = React.createRef()
}
componentDidMount(){
this.fetchPageData().then(() => {
WSConn.connect();
WSConn.subscribe('topicName', topicHandler);
});
}
async fetchPageData() {} // fetch from api
topicHandler(message) {
.... // process the message
}
render(){
return (
<Fragment>
<WSConn ref={this.wsRef} />
... //other contents
</Fragment>
)
}
}
Home.spe c. js
....
let server;
beforeEach(() => {
// create a WS instance, listening on port 1234 on localhost
server = new WS(SOCKET_URL);
});
afterEach(() => {
server.close();
});
it('should trigger topic handler', (done) => {
expect.assertions(2);
const spyHandler = jest.fn(Home.prototype, 'topicHandler');
const wrapper = mount(<Home />);
setTimeout(() => {
server.send({
destinationName: 'topicName',
payloadString: 'hello',
});
expect(spyHandler).toHaveBeenCalledTimes(1); // always return 0
done();
}, 0);
....