假设您正在 Node.JS 中运行一个集群,并且您希望对其进行单元测试。例如,您想确保如果一个工作人员死亡,集群会采取一些措施,例如分叉另一个工作人员和可能的一些相关工作。或者,在某些条件下,会产生额外的工人。
我想为了做到这一点,必须启动集群并以某种方式访问其内部状态;然后(例如)强迫工人卡住,并在延迟后检查状态。如果是这样,如何导出状态?
您必须构建您的 master 以返回对其集群对象的引用。在您的测试中,您可以使用cluster.workers[2].kill()
. worker 对象还具有对子进程对象的引用,您可以使用它来模拟各种条件。您可能必须使用 setTimeout 来确保 master 有时间做它的事情。
然而,上述方法仍然会创建分叉,这在测试场景中可能是不可取的。您的另一个选择是使用模拟库(SinonJS 等)来模拟cluster
的 fork 方法,然后监视它获得的调用次数。您可以通过cluster.emit('exit')
在主集群对象上使用来模拟工作人员死亡。
注意:我不确定这是否只是我的问题,但cluster.emit
出于某种原因,我似乎总是发出两次。