3

我正在使用 PHPUnit 测试 Symfony2 项目中使用的类的私有方法。我正在使用许多开发人员描述的私有方法测试策略(通过反射),例如http://aaronsaray.com/blog/2011/08/16/testing-protected-and-private-attributes-and-methods-using -phpunit/

但不幸的是,我收到以下错误:

有 1 个错误:1) My\CalendarBundle\Tests\Calendar\CalendarTest::testCalculateDaysPreviousMonth ReflectionException: Class Calendar 不存在 /Library/WebServer/Documents/calendar/src/My/CalendarBundle/Tests/Calendar/CalendarTest.php:47

<?php
namespace My\CalendarBundle\Tests\Calendar;

use My\CalendarBundle\Calendar\Calendar;

class CalendarTest 
{    
    //this method works fine     
    public function testGetNextYear()
    {
        $this->calendar = new Calendar('12', '2012', $this->get('translator'));        
        $result = $this->calendar->getNextYear();

        $this->assertEquals(2013, $result);
    }

    public function testCalculateDaysPreviousMonth()
    {        
        $reflectionCalendar = new \ReflectionClass('Calendar'); //this is the line

        $method = $reflectionCalendar->getMethod('calculateDaysPreviousMonth');      
        $method->setAccessible(true);

        $this->assertEquals(5, $method->invokeArgs($this->calendar, array()));                 
    }
}

为什么?

先感谢您

4

1 回答 1

9

在创建反射方法时,您需要使用整个命名空间的类名,即使您包含一个use语句。

new \ReflectionClass('My\CalendarBundle\Calendar\Calendar');

这是因为您将类名作为字符串传递给构造函数,因此它不知道您的use语句,而是在全局命名空间中查找类名。

此外,对于它的价值,您实际上不需要创建一个ReflectionClass,然后调用getMethod()它。相反,您可以直接创建一个ReflectionMethod对象。

new \ReflectionMethod('My\CalendarBundle\Calendar\Calendar', 'calculateDaysPreviousMonth');

这应该基本相同,但要短一些。

于 2012-10-16T16:54:48.110 回答