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

Я создаю приложение React и использую реактивный шаблон в качестве базового проекта. После ознакомления с Redux, Sagas, повторным выбором и запуском первых компонентов я хотел бы написать соответствующие модульные тесты. Но, к сожалению, я не могу получить тест для оператора 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: [ ] }) }) равен объекту ({@@ redux-saga / IO: true, SELECT: Object ({селектор: функция, аргументы: [ ] }) }).

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

1 ответ

Решение

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

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

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

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

Модифицированный JSFiddle

Другие вопросы по тегам