如何用 jasmine 测试 `select(reselectSelector)`?

How to test a `select(reselectSelector)` with jasmine?

我正在创建一个 React application and use react-boilerplate as my base project. After getting my head around Redux, Sagas and reselect 并获得了我的第一个组件 运行,我想编写相应的单元测试。但不幸的是,我无法通过相应的 select 或正确测试来获得 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);
  });
});

从我的角度来看,这个测试应该可行,但它失败了(不是很有用)错误消息:

Expected Object({ @@redux-saga/IO: true, SELECT: Object({ selector: Function, args: [ ] }) }) to equal Object({ @@redux-saga/IO: true, SELECT: Object({ selector: Function, args: [ ] }) }).

为了更容易地重现问题,我创建了一个具有所需环境的 JSFiddle。也许有人可以告诉我我做错了什么。

您的测试失败,因为预期和实际情况下的选择器函数在引用上不等效。

函数 selectDomainMessage return 是 return 由 createSelector 编辑的函数;每次 createSelector 运行时,它都会 return 一个新函数。

为了让你的测试通过,你可以捕获 createSelector 的 return 函数作为一个变量,并让 selectDomainMessage return 那:

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

已修改JSFiddle