Jackson Zhang

Results 3 comments of Jackson Zhang

很久没有看到这样的好文章了,把React单元测试分析的比较全面,思路非常清楚,对单元测试的理解非常到位。有几点反馈:除了 @JosephYao 提到的测试表现力外,测试数据的准备有时不需要写的冗长包含各种细节,只突出关键。比如: ```js const comments = [ { id: 283992, author: '男***8', comment: '价廉物美,相信奥康旗舰店' }, { id: 283993, author: '雨***成', comment: '因为工作穿皮鞋时间较多,所以一双合脚的鞋子...' }, { id: 283994, author: '叶***亮', comment:...

另外,对我来说测试要明确测试的意图,也就是测试的目标逻辑要清晰。其实你讲的很多内容都是在达成这一点,比如仅对输入输出敏感、不依赖于内部实现,以及什么测什么不测,你举的很多例子都很好的说明了这点。但是在Saga测试这一段,我觉得没有说清楚(当然也有可能是我Saga用的少)。 我觉得这里前后的两个例子并没有很好的证明你的观点“仅对输入输出敏感、不依赖于内部实现”。如果按照“正确的姿势”来写前一个例子,其实真正让你觉得舒服,符合你描述的有点,关键在于toHaveBeenDispatched这个matcher。 为什么这么说呢?“不完美的姿势”让你觉得“违反上述所说「仅对输入输出敏感」的原则”,或者改动代码容易让测试失败的原因是使用了Generator。Generator返回的迭代器是关切顺序的。这里实际代码的要实现的逻辑,据我理解是不关心顺序的,我只要取了这些数据就行。 而你使用testSaga和toHaveBeenDispatched恰恰就避免了顺序的影响。因此,如果“不完美的姿势”里,写一个工具方法把Generator返回的迭代器里的内容放到一个数组或hash对象之类的容器里,只需判断容器内是否有你想要的action就行。 而stub select函数或者api调用,我觉得差别其实没多大。 总体而言,我觉得用testSaga来测试也没什么问题,但就saga的输入输出而言,确实就是参数和迭代器,因为saga就是个Generator函数而已,虽然它的唯一使用者是redux-saga。不用testSaga也可以实现你要的效果,所以在这里这两个例子没有充分表述你的观点。 我只是读你这段的时候稍微花了点时间研究了Saga和Generator,所以如果我的理解有问题,你也可以帮忙指出。谢谢😄

哦,对了,为了明确测试的意图,我通常不用参数化测试,因为很容易迷失掉测试的意图(对于写和读测试的人都一样),纯粹覆盖可能的数据。