如何在redux-saga的jest测试中产生多个值

时间:2017-07-30 02:36:46

标签: react-native generator jestjs redux-saga

我刚刚开始使用Jest为我的React Native项目编写测试,该项目使用了redux-sagas和generator函数。我没有很多测试经验,所以如果这是基本的话,请原谅我的无知。

我有以下函数,它根据另一个函数的结果来定义变量。我无法弄清楚如何模拟多个变量...

我的功能

export function * getAssets (api) {
  const bearerToken = yield select(selectBearerToken)
  const timelines = yield select(selectTimelines)

  if (timelines) {
    // Do stuff with timelines
    const response = yield call(api.getAssetById, bearerToken, 'abc123')
  }
}

我的测试

const stepper = (fn) => (mock) => fn.next(mock).value

test('getAssets', () => {
  const step = stepper(getAssets(FixtureAPI))
  const bearerToken = 'bearer_test_token'
  const timelines = 'mocked for brevity'

  expect(step()).toEqual(select(selectBearerToken))
  expect(step()).toEqual(select(selectTimelines))
  expect(step(timelines)).toEqual(call(FixtureAPI.getAssetById(bearerToken, 'B13fGCE_l')))
})

问题

当它调用getAssetById时,bearerToken未定义,但timelines已定义;因为我把它传递给了step()。如何将timelinesbearerToken同时传递到step()?这甚至是我怎么做的?

1 个答案:

答案 0 :(得分:0)

您可以花一些时间在这里阅读JavaScript生成器 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators,尤其是高级生成器部分。

长话短说,yield将返回yield调用next关键字后的表达式评估值。在这种情况下,当您第一次调用step()时,返回值应该是select(selectBearerToken)计算的值。 next也可以接受一个值,即.next(val),它将作为yield调用的返回值传回。这是第三次使用step()致电timelines时,首先将timelines传回前一个yield,然后继续yield停止并返回。

您希望对此进行正确测试的方式是进行第二次step()来电,还会传回bearerToken的值,即expect(step(bearerToken)).toEqual(select(selectTimelines))。然后,应该设置bearerToken。

一个建议是将step()调用与您的断言分开,以便更容易理解IMO。