Unit testing React/Redux应用程序的单元测试

Unit testing React/Redux应用程序的单元测试,unit-testing,reactjs,tdd,redux,Unit Testing,Reactjs,Tdd,Redux,我目前正在研究基于Redux/React的应用程序的测试方法。我阅读了关于测试的redux教程,但仍然有问题: 测试纯动作创建者是否有意义,因为它只返回带有类型和有效载荷字段的对象?对我来说,它闻起来像是OO应用程序中的getter/setter测试 在测试异步操作的情况下,您是否应该检查相应的成功操作和已调度的操作?同样,在模拟HTTP请求的情况下,似乎只是测试模拟容器,而不是应用程序行为 由于减速器负责状态转换,测试是否应集中在减速器中,以确定连接部件的行为 也许不应该测试应用程序的redu

我目前正在研究基于Redux/React的应用程序的测试方法。我阅读了关于测试的redux教程,但仍然有问题:

  • 测试纯动作创建者是否有意义,因为它只返回带有
    类型
    有效载荷
    字段的对象?对我来说,它闻起来像是OO应用程序中的
    getter/setter
    测试

  • 在测试异步操作的情况下,您是否应该检查相应的成功操作和已调度的操作?同样,在模拟HTTP请求的情况下,似乎只是测试模拟容器,而不是应用程序行为

  • 由于减速器负责状态转换,测试是否应集中在减速器中,以确定连接部件的行为

  • 也许不应该测试应用程序的redux内核,而应该更多地在组件级别上进行测试?什么时候应该测试组件的哪些方面?这些测试是脆弱的吗


  • 我想听听在生产中使用Redux/React并积极实践测试的人员的一些经验

    我将依次回答每个问题,只是根据我的经验给出不同程度的细节

    tl dr:关注特定于应用程序的行为和功能测试,让库担心redux实现细节,并在组件中使用之前测试小型reducer函数

  • 如果您像我最初使用redux那样使用抽象,那么就不是真的。如果要反复手动返回具有相同属性的对象,只需设置一个简单的测试用例,该测试用例在公开的动作创建者上循环,使用值调用它们并检查返回的对象类型。对一些人来说是过度杀戮,但当你有很多动作创作者时,它会成为一种廉价的理智检查。例:

    for (var i = 0; i < actions.length; i++) {
      let action = actions[i](testData);
      expect(action).to.have.property('type');
      expect(action).to.have.property('payload');
    }
    
    然后在单独的测试用例中测试每个减速器(
    reduceA
    reduceB
    )的行为。您仍然希望测试返回的结果及其形状,但始终尝试在实现和测试中分解还原器

  • 和以前一样,在特定的组件框架(这里假设为react.js)中使用小函数之前,应该先测试它们的实现。如果你遵循本手册中给出的建议

    建议只有应用程序的顶级组件(如路由处理程序)知道Redux。其下方的组件应具有代表性,并通过道具接收所有数据

    然后,您需要测试的就是顶级组件获得redux的
    dispatch
    ,然后测试简单组件是否调用像
    onClick
    这样的处理程序,或者从您的存储中提取正确的状态,但这些应该只需要是简单的间谍或对道具的形状和价值的断言,不是真的与redux相关


  • 您可以尝试使用来测试动作和动作创建者。它允许编写一行可读的断言,并避免存储准备阶段。

    2。我认为在调度多个操作时值得测试,比如:FOO_加载、FOO_接收。检查它们是否以正确的顺序和正确的有效载荷发送。
    const reducer = combineReducers({
      a: reduceA,
      b: reduceB
    })