如何对不返回值的php类构造函数进行单元测试

时间:2014-08-08 22:08:59

标签: php unit-testing testing phpunit codeception

我对如何对构造函数进行单元测试感到有些困惑,特别是因为它没有返回任何值。

我们假设我有这门课程:

class MyClass {

    /** @var array */
    public $registered_items;

    /**
     * Register all of the items upon instantiation
     *
     * @param  array  $myArrayOfItems  an array of objects
     */
    public function __construct($myArrayOfItems) {
        foreach($myArrayOfItems as $myItem) {
            $this->registerItem($myItem);
        }
    }

    /**
     * Register a single item
     *
     * @param  object  $item  a single item with properties 'slug' and 'data'
     */
    private function registerItem($item) {
        $this->registered_items[$item->slug] = $item->data; 
    }

}

显然这有点做作,而且非常简单,但这是为了问题。 =)

所以是的,我如何在这里为构造函数编写单元测试?

奖金问题:我是否认为在这种情况下不需要对registerItem()进行单元测试?

修改

如果我重新考虑从构造函数中删除逻辑怎么样?在这种情况下,我如何测试registerItem()

class MyClass {

    /** @var array */
    public $registered_items;

    public function __construct() {
        // Nothing at the moment
    }

    /**
     * Register all of the items
     *
     * @param  array  $myArrayOfItems  an array of objects
     */
    public function registerItem($myArrayOfItems) {
        foreach($myArrayOfItems as $item) {
            $this->registered_items[$item->slug] = $item->data;
        }

    }

}

2 个答案:

答案 0 :(得分:0)

添加查找已注册项目的方法。

class MyClass {
    ...

    /**
     * Returns a registered item
     *
     * @param string $slug unique slug of the item to retrieve
     * @return object the matching registered item or null
     */
    public function getRegisteredItem($slug) {
        return isset($this->registered_items[$slug]) ? $this->registered_items[$slug] : null;
    }
}

然后检查传递给测试中构造函数的每个项目是否已注册。

class MyClassTest {
    public function testConstructorRegistersItems() {
        $item = new Item('slug');
        $fixture = new MyClass(array($item));
        assertThat($fixture->getRegisteredItem('slug'), identicalTo($item));
    }
}

注意:我正在使用Hamcrest assertions,但PHPUnit应该具有等效功能。

答案 1 :(得分:-1)

对于第一个代码

public function testConstruct{
    $arrayOfItems = your array;

    $myClass = new MyClass($arrayOfItems);

    foreach($arrayOfItems as $myItem) {
       $expected_registered_items[$item->slug] = $item->data;
    }

    $this->assertEquals($expected_registered_items, $myClass->registered_items);
}