Warning: Undefined global variable $debug in /var/www/ourcoders/tiny4cocoa/application/controllers/baseController.php on line 124
有个梨UGlee 2019-12-07 00:00:00 发布的技术动态 - OurCoders (我们程序员)
有个梨UGlee
2019-12-07 00:00:00 发布
那些真正值得讲的代码,都是从一坨紧耦合的代码开始的;代码本身并没有功能问题,设计上加上一些文档和一些时间也是大部分程序员可以理解的。

但是当你真的要开始单元测试的时候发现很难做到unit,即使你知道mock,知道dependency injection,还是会遇到很多内部模块在单元测试时需要mock。

这时候出问题的地方就是reference。

我不知道在early binding语言里有什么好的办法,还是写一堆mock是正常的。但是在late binding语言里,解决方法是不要传进去reference,代之以它需要的最小的接口函数。这样单元测试就可以保持“单元”。

在js这样的语言里,结构性的reference可以在构造完成后再添加上去,尤其是双向的关系,这是更好的做法,因为它保证了双向关系的建立是在一处代码完成的。

一个对象可以逐步构造成full fledged,但是它可以有个最小的必要资源和状态,单元测试也是从这里开始,保证没有任何optional配置和附加责任的测试通过;然后是附加责任,一些附加责任可以设计成可选的,比如向对象传入一个emit函数就可以是可选的,有则emit,妹有则pass;至于外部关系的测试,不隶属于这个模块,而是属于容器。

如果你不能做到这样的单元测试,而是必须mock一堆依赖,或者必须把几个紧耦合模块组装之后才能写测试----这实际上已经是集成测试了----这说明设计出了问题。应该考虑结构和关系哪里出了问题。

一般而言,代码中出现一些所谓的helper class,需要握着外部大杂烩式容器的引用才能工作,就是有问题了。