我对如何对构造函数进行单元测试感到有些困惑,特别是因为它没有返回任何值。
我们假设我有这门课程:
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;
}
}
}
答案 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);
}