Как протестировать select (reselectSelector) с жасмином?

Я создаю приложение React и использую react-boilerplate в качестве моего базового проекта. Изучив Redux, Саги и повторно выбрать и запустил свои первые компоненты, я хотел бы написать соответствующие модульные тесты. Но, к сожалению, я не могу получить тест для оператора select с соответствующим селектором для правильной проверки:

const selectDomain = () => (state) => state.get('myDomain');
const selectDomainMessage = () => createSelector(selectDomain(), (domain) => domain.get('message'));

function* send() {
  const message = yield select(selectDomainMessage());
  ...
  yield put(sentAction(message);
}

describe('send Saga', () => {
  const generator = send();

  it('should return select descriptor', () => {
    let expectedDescriptor = select(selectDomainMessage());
    let returnedDescriptor = generator.next().value;

    expect(returnedDescriptor).toEqual(expectedDescriptor);
  });
});

С моей точки зрения, этот тест должен работать, но он не работает с (не очень полезным) сообщением об ошибке:

Ожидаемый объект({ @@redux-saga/IO: true, SELECT: Object({ selector: Function, args: [ ] }) }) равен Object({ @@redux-saga/IO: true, SELECT: Object( { селектор: функция, аргументы: [ ] }) }).

Чтобы упростить воспроизведение проблемы, я создал JSFiddle с необходимой средой. Может кто подскажет, что я делаю не так.


person Oliver    schedule 06.04.2017    source источник


Ответы (1)


Ваш тест не пройден, потому что функции селектора в ожидаемом и фактическом случаях ссылочно не эквивалентны.

Функция selectDomainMessage возвращает функцию, возвращенную createSelector; и каждый раз, когда запускается createSelector, он возвращает новую функцию.

Чтобы ваш тест прошел, вы можете зафиксировать функцию возврата createSelector в качестве переменной и заставить selectDomainMessage возвращать это:

const selector = createSelector(selectDomain(), (domain) => domain.get('message'))
const selectDomainMessage = () => selector;

Изменен JSFiddle.

person Jonathan Huang    schedule 06.04.2017