PHP在ReflectionClass上调用一个方法

时间:2016-06-02 19:12:09

标签: php laravel reflection phpunit

我是一名新手开发人员,试图为现有的Laravel应用编写测试套件。目前我正在尝试为控制器编写测试但是使用的身份验证系统奇怪地实现并且难以绕过。我不能简单地说:

$user = \User::find(1);
$this->be($user);

我需要实例化控制器并在其基类中设置私有属性。为了解决这个问题,我尝试使用反射并手动设置构造函数属性和用户属性。当我尝试在反射对象上调用该方法并且我不知道如何绕过它时,我的问题出现了。我的测试方法:

public function testCount()
{
    $user = \User::find(1);
    $this->be($user);

    $leadRepositoryInterface = m::mock('CRM\Storage\Lead\LeadRepositoryInterface');
    $response = m::mock('ColorJar\ApiResponse\Response');

    $leadsController = new ReflectionClass('LeadsController');

    $leadsControllerLead = $leadsController->getProperty('lead');
    $leadsControllerLead->setAccessible(true);
    $leadsControllerResponse = $leadsController->getProperty('response');
    $leadsControllerResponse->setAccessible(true);
    $leadsControllerCrmuser = $leadsController->getProperty('crmUser');
    $leadsControllerCrmuser->setAccessible(true);

    $leadsControllerLead->setValue($leadsController, $leadRepositoryInterface);
    $leadsControllerResponse->setValue($leadsController, $response);
    $leadsControllerCrmuser->setValue($leadsController, $user);

    $reflectionMethod = new ReflectionMethod('ReflectionClass', 'count');

    $this->assertEquals('jdsf', $reflectionMethod->invoke($leadsController));
}

生成以下错误:

LeadsControllerTest::testCount
ReflectionException: Method ReflectionClass::count() does not exist

我意识到我在ReflectionClass的一个实例上调用count()而不是LeadsController,但我不知道如何设置这些属性,特别是crmUser,因为它是私有属性LeadsController继承的类。我如何使这项工作?

1 个答案:

答案 0 :(得分:0)

你应该使用PHPUnit的模拟功能。

https://phpunit.de/manual/current/en/test-doubles.html

示例9.7:对方法调用进行存根以从回调中返回值

可能会有所帮助,你可以配置你的“计数”调用的结果。