我刚刚开始使用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()
。如何将timelines
和bearerToken
同时传递到step()
?这甚至是我怎么做的?
答案 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。