我如何用params测试一个传奇

时间:2018-02-15 10:33:53

标签: reactjs jestjs redux-saga

第一次学习如何测试传奇(使用Jest)。我的传奇需要传递给它的对象包含userId,但我收到此错误,这显然突出了参数的差异:

Expected value to equal:
  {"@@redux-saga/IO": true, "CALL": {"args": [], "context": null, "fn": [Function getClassrooms]}}
Received:
  {"@@redux-saga/IO": true, "CALL": {"args": ["1"], "context": null, "fn": [Function getClassrooms]}}

我有:

import { call, put } from 'redux-saga/effects';

import { theSaga } from './saga.js';
import { apiCall } from './api';

it('should do something', () => {
  const data = {
    payload: {
      userId: '1'
    }
  };

  const generator = theSaga(data);

  expect(generator.next().value)
    .toEqual(call(apiCall));

});

我不确定如何让两者相匹配?我已经尝试将线路更改为:

.toEqual(call(apiCall('1'));

但是这给出了关于函数不是承诺的错误。

1 个答案:

答案 0 :(得分:0)

call是一个传奇函数,它返回由saga中间件执行的动作。 call期望函数的参数被附加到它的参数中,所以call(apiCall,1)。关于这一点的好处是可以通过简单地走每一步来检测生成器,并检查是否生成了预期的动作。 expect(generator.next().value).toEqual(call(apiCall,1))

那说;我不太习惯用这种方式测试发电机。您希望测试行为而不是 如何实现生成器。你把东西放进去,并期待一些东西(在不同的情况下)。像expect(generator.next().value).toEqual(call(apiCall,1))这样的测试就像是说:我实际编程了我编程的内容,测试证实了这一点。