当要对类中的私有方法进行测试时很难通过 new  一个对象的方法来创建对象的实例然后调用方法进行单元测试,此时有两种方法进行私有方法的测试。

方法一

这种方法是使用使用反射的方式来读取代码文件,然后再对要测试的方法的可见性进行改变以使得可以在外部调用。

    public function testCleanMetrics()
    {
        $metrics = [
            'key1' => 'value1',
            'key2' => 'value2',
            'key3' => 'value3'
        ];

        $method = new \ReflectionMethod('\Cronitor\Monitor', 'cleanMetrics'); // 反射获取类的方法
        $method->setAccessible(true); // 修改方法的可访问性

        $cleanMetricsResult = $method->invokeArgs($this->monitor, [$metrics]);

        $this->assertSame('key1:value1', $cleanMetricsResult[0]);
        $this->assertArrayNotHasKey('key1', $cleanMetricsResult);
    }

方法二

这种方法是通过写一个匿名函数并对函数进行重新绑定的类的函数到匿名函数的方式

    public function testCleanMetrics()
    {
        $metrics = [
            'key1' => 'value1',
            'key2' => 'value2',
            'key3' => 'value3'
        ];

        $monitor = new \Cronitor\Monitor();

        $bar = function () use ($metrics) {
            return $this->cleanMetrics();
        };

        $baz = $bar->bindTo($monitor, $monitor);

        $this->assertSame('key1:value1', $baz()[0]);
        $this->assertArrayNotHasKey('key1', $$baz());
    }