目前可以编写reducer并测试如下的sagas:

// selector
const selectThingById = (state, id) => state.things[id]

// in saga
const thing = yield select(selectThingById, id)

// and test
expect(gen.next().value)
  .toEqual(select(selectThingById, id))


但是我想使用更多功能方法来编写我的reducer并将数据(状态)放在参数的最后:

// selector
const selectThingById = R.curry((id, state) => state.things[id])

// in saga
const thing = yield select(selectThingById(id))

// test: this actually fails
expect(gen.next().value)
  .toEqual(select(selectThingById(id)))


测试失败,因为selectThingById(id)每次都会创建新函数。

这可以通过选择将参数放在select之前而不是追加来解决。是否有可能或有任何方法可以测试这种选择器?

最佳答案

您需要使用call效果调用选择器工厂,以便可以使用gen.next(val)将正确的函数注入到传奇中

// in saga
const selector = yield call(selectThingById, id)
const thing = yield select(selector)

// test
const selector = selectThingById(id)
gen.next(selector)
  .toEqual(call(selectThingById, id))
expect(gen.next().value)
  .toEqual(select(selector))

关于javascript - 如何在Redux传奇中测试功能选择器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45751764/

10-09 20:04