Как шутить тестировать события eventChannel в redux-saga - PullRequest
4 голосов
/ 09 мая 2020

У меня есть следующая функция, которую я хотел бы протестировать. Как видите, это функция-генератор с некоторыми событиями Redux Saga. Согласно отчету Jest, я все еще не могу пройти тест для строк, которые я указываю стрелкой вправо (->) в начале соответствующей строки кода.

export function* createPublisher(properties: TokboxScreenshare.PublisherProperties) {
  let publisherChannel;
  let publisher;
  const container = document.createElement('div');
  container.setAttribute('class', 'screen-preview');
  const errorChannel = eventChannel(send => {
    publisher = window.OT.initPublisher(container, properties, err => send(err || END));
    return () => {};
  });
  yield call(handleChannelTimeout, errorChannel);
  publisherChannel = eventChannel(send => {
    publisher.on('mediaStopped', () => {
      // The user clicked stop.
   -->   send(put(Actions.screenshareAction(Actions.ScreenshareActionType.StopShare)));
    });
    publisher.on('streamDestroyed', () => {
   -->   send(put(Actions.screenshareAction(Actions.ScreenshareActionType.StopShare)));
    });
    publisher.on('streamCreated', event => {
   -->  send(call(onStreamCreated, event));
    });
    return () => {
   -->   publisher.off('mediaStopped');
   -->   publisher.off('streamDestroyed');
   -->   publisher.off('streamCreated');
    };
  });
-->   yield spawn(function*() {
  -->  yield takeEvery(publisherChannel, function*(message: any) {
  -->    yield message;
    });
  });
  yield call(publishToSession, publisher);

  return { publisher, publisherChannel };
}

и мой тест на данный момент выглядит следующим образом:

it('Creates the publisher', () => {
  const properties: TokboxScreenshare.PublisherProperties = {
    videoSource: 'screen',
    maxResolution: {
      width: 1920,
      height: 1080
    },
    mirror: false,
    fitMode: 'contain',
    publishAudio: false
  };
  const event = {
    stream: {
      id: 'streamId'
    }
  };
  let callback = () => {};
  window.OT = {
    initPublisher: jest.fn((_1, _2) => {
      return {
        on: _ => {},
        off: () => {},
        send: jest.fn()
      };
    })
  };
  const publisher = window.OT.initPublisher((_container, _properties, func) => {
    func();
    return {
      on: (name, cb) => {
        if (name === 'mediaStopped' || name === 'streamDestroyed' || name === 'streamCreated') {
          callback = cb;
        }
      },
      off: () => {},
      send: jest.fn()
    };
  });
  callback();
  console.log('publisher ->>> ', publisher);
  const channel = eventChannel(send => {
    publisher.on('mediaStopped', () => {
      send('hello world');
    });
    publisher.on('streamDestroyed', () => {
      send('hello world');
    });
    publisher.on('streamCreated', () => {
      send('hello world');
    });
    return () => {
      publisher.off('mediaStopped');
      publisher.off('streamDestroyed');
      publisher.off('streamCreated');
    };
  });
  return expectSaga(Sharing.createPublisher, properties)
    .provide([
      [matchers.call.fn(Sharing.publishToSession), null],
      [matchers.call.fn(Sharing.onStreamCreated), event]
    ])
    .dispatch(Actions.screenshareAction(Actions.ScreenshareActionType.StopShare))
    .dispatch({ type: 'TAKE_EVERY', payload: channel })
    .silentRun();
});

Есть какие-нибудь подсказки или предложения, что я здесь делаю не так?

...