【问题标题】:redux-saga testing with tape使用磁带进行 redux-saga 测试
【发布时间】:2017-01-17 17:57:54
【问题描述】:

我正在尝试对 redux-saga 进行测试。当我出于某种未知原因执行 generator.next(data).value 时,数据不会传递给 saga 函数,如下所示:

const gen = onCreateMessage()

const message = "aa"

gen.next(message).value

///佐贺函数

export function* onCreateMessage(message) {

    yield put(addMessage(message.payload))

错误信息。无法读取未定义的负载。

【问题讨论】:

    标签: javascript redux redux-saga


    【解决方案1】:

    问题是您的生成器函数接受message 作为参数,因此您需要在初始化生成器时传递它:

    const gen = onCreateMessage( /* the message */ )
    

    然后您可以通过执行gen.next().value 并验证您的断言来获得下一个值。

    这是一个带有示例的 JS Bin:http://jsbin.com/catisu/edit?js,console

    const { put, take } = ReduxSaga.effects;
    const { expect } = chai;
    
    const createMessage = message => ({
      type: 'CREATE_MESSAGE',
      payload: message,
    });
    
    const addMessage = message => ({
      type: 'ADD_MESSAGE',
      payload: message,
    });
    
    function* onCreateMessage(message) {
      yield put(addMessage(message.payload));
    }
    
    // In your test
    const message = 'some message';
    
    // Message is passed when the generator is initialized
    const gen = onCreateMessage(createMessage(message))
    let next = gen.next();
    
    // Using Chai here but with tape it'd be the same concept
    try {
      expect(next.value).to.eql(
        put(addMessage(message))
      );
      
      console.log('It works!');
    } catch(e) {
      console.error('bummer');
    }
    <script src="https://npmcdn.com/redux-saga@0.11.1/dist/redux-saga.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.min.js"></script>

    这也是一件小事,但看起来你的生成器正在期待一个带有 payload 键的对象,所以普通字符串不起作用。

    【讨论】:

    • 谢谢,在初始化生成器时传入消息,但我想我可以在 gen.next(message).value 处传入消息,例如 joelhooks.com/blog/2016/03/20/… 我还必须使用 const gen = onCreateMessage (createMessage(message)) 而不是 const gen = onCreateMessage( /* the message */ ) 因为我的 onCreateMessage 期待 message.payload 我猜 'payload' 键自动包含在来自 'redux-actions' 的 { createAction } 中? ?我是这样使用的——export const createMessage = createAction(CREATE_MESSAGE);
    • 对不起,我想我现在明白了 - 我对生成器函数和使用 gen.next() 调用的 yield put 函数感到困惑
    • 是的,听起来你是在正确的轨道上。没错,来自redux-actionscreateAction 会自动使用payload 键生成一个对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多