【问题标题】:Testing redux-saga测试 redux-saga
【发布时间】:2016-09-23 16:27:57
【问题描述】:

我正在尝试按如下方式对 redux saga 进行测试,但遇到了问题。我得到的错误是无法读取未定义的属性有效负载。由于某种原因,我传递给 saga 函数的“消息”变量未定义,谁能告诉我为什么?谢谢

  saga.spec.js
    import test from 'tape'
    import { put,take,call } from 'redux-saga/effects'
    import { onCreateMessage } from '../src/common/sagas/messages'
    import { addMessage,createMessage } from '../src/common/reducers/messages'


    test('createMessage', assert => {
        const gen = onCreateMessage()



        var message = {
            id: 1234,
            channelID: "AA",
            text: "text",
            user: "user"
          }

        assert.deepEqual(
            gen.next(message).value,
            put(addMessage(message)),
            'createMessage should dispatch addMessage action'
        )

    })

saga/index.js
export default function* rootSaga(){

    yield [ 

        takeEvery('CREATE_MESSAGE', onCreateMessage),
        ......
        ]

当我在下面控制台记录消息时,我得到“未定义”

export function* onCreateMessage(message) {
    console.log(message)
    yield put(addMessage(message.payload))

    try {
        yield call(fetch,'/api/newmessage',
            {
             method: 'post',
             headers: {
                'Content-Type': 'application/json'
                },
             body: JSON.stringify(message.payload)}
            )

    } catch (error){
        throw error
    }
}

我正在使用 redux-actions 中的 actionCreator:

export const addMessage = createAction(ADD_MESSAGE);

【问题讨论】:

  • 你必须在 takeEvery 上传递参数...如果没有,使用 take effect 将第一个 action 生成到 onCreateMessage 中,你可以通过 action 获取 message 上的值。

标签: redux redux-saga


【解决方案1】:

改变

const gen = onCreateMesaage()

const gen = onCreateMessage(message)

解释:

message 是传递给生成器函数的参数,而不是yield 结果。 以前的代码适用于产生的结果。例如

export function* onCreateMessage() {
    const message = yield 
    console.log(message)
    yield put(addMessage(message.payload))
}

【讨论】: