PHPUnit - 模拟私有方法的返回值

时间:2015-12-15 15:15:12

标签: php unit-testing

我创建了一个带有函数的类,该函数使用file_get_contents()

向外部网站发出请求
class MyClass {

    public function emailExternal($email, $url){

        $url = $url;
        $data = array('email' => $email);

        $options = array(
            'http' => array(
                    'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                    'method'  => 'POST',
                    'content' => http_build_query($data),
            ),
        );
        $context  = stream_context_create($options);

        $result = $this->makeExternalRequest($url, $context);

        return $result;

    }

    private function makeExternalRequest($url, $context){

        return json_decode(file_get_contents($url, false, $context), true);
    }

}

我删除了一些功能,所以我只是暴露了理解我的问题所需要的东西(这就是为什么这个功能并没有真正起作用)

我需要测试emailExternal函数,但需要模拟makeExternalRequest函数的返回。这样我就可以模拟成功/不成功的回复。

到目前为止,这是我的attemot:

public function testEmailFromExternalSiteInvalidEmail(){

    $results = [
            'message' => 'test'
    ];

    $stub = $this->getMockBuilder('MyClass')
            ->setMethods(['makeExternalRequest'])
            ->getMock();
    $stub->expects($this->once())
            ->method('makeExternalRequest')
            ->withAnyParameters()
            ->will($this->returnValue($results));

    $stub->emailExternal(['email' => 'test@test.co.uk'], 'http://test.com');

}

如果makeExternalRequest函数是公共的或受保护的,但在私有时不再有效,则上述工作正常。它需要我保持这个功能私有,但也需要我测试。有谁知道我能做什么?

1 个答案:

答案 0 :(得分:1)

如果你问的是真的:

  

我需要测试emailExternal函数,但需要模拟makeExternalRequest函数的返回。这样我就可以模拟成功/不成功的回复。

然后我有个好消息。由于public方法直接从远程调用(在私有方法内)返回状态,您只需要模拟pbulic调用,这可以像phpunit手册中概述的那样轻松完成。您可以使该方法返回您想要的任何内容,以便您可以进行模拟。

这实际上就像你已经做过的那样,但只是在错误的方法上。只需模拟名为 emailExternal 的公共方法。

你通常不需要在单元测试中模拟私有(或非公共)方法,实际上你根本不能模拟私有,因为模拟对象将从被模拟的类扩展而私有是从任何扩展中看不到的类。

另请参阅我们在网站上提供的有关此主题的非常有用的参考资料: