PHPUNIT - 测试作为类的新实例的回调



我有一个调用WordPress全局函数"add_menu_page"的类 该函数接收许多参数,其中一个是回调,在这种情况下,该回调将创建一个类"CreateAdminMountPoint"的新实例。

在我的 PHPUnit 测试中,我模拟了admin_menu_page函数及其预期的"with"参数。

我的问题在于回调类,在我的测试中,我将断言设置为:

array(new CreateAdminMountPoint(array('slug' => 'brands')), 'addMountPoint')

这显然是一种不好的做法,因为我的测试现在依赖于一个单独的类,而不是孤立地测试。

如何更改我的测试,使其不依赖于 CreateAdminMountPoint?

班级

class CreateAdminMenus {
public function addMenuPages($tables) {      
foreach( $tables as $menu ) {
add_menu_page(
$menu['title'],
$menu['title'],
$menu['wp-menu']['capability'],
'pup/' . $menu['title'] . '/edit.php',
[new CreateAdminMountPoint($menu), 'addMountPoint'], // Trying to test this without being dependant on CreatAdminMountPoint
$menu['wp-menu']['icon']
);
} 
}
}

测试用例

class CreateAdminMenusTest extends LSMTestCase {
protected function setup() {
$this->tables = array(
'brands' =>
array(
'title' => 'title',
'slug' => 'brands',
'wp-menu' =>
array(
'capability' => 'capability',
'icon' => 'icon',
),
),
);
}
public function testMenusAreCreated() {
$adminMenus = new CreateAdminMenus;
$mock = $this->mockGlobalFunction('add_menu_page');
$mock->expects($this->exactly(1))
->method('add_menu_page')
->with(
'title',
'title',
'capability',
'pup/title/edit.php',
array(new CreateAdminMountPoint(array('slug' => 'brands')), 'addMountPoint'),
'icon'
);
$adminMenus->addMenuPages($this->tables);
}
}

现在编写代码的方式不可能以任何其他方式对其进行测试。这实际上并不像你想象的那么糟糕。如果我在拉取请求中看到这样的测试,我会批准它。

话虽如此,我可以想象你确实想更彻底地测试它。最好的解决方案是使用CreateAdminMountPointBuilder类。因此,而不是内联创建新对象。您可以使用新类来构建它。通过这种方式,您可以在测试中模拟该类,并断言来自构建器的模拟响应已放入函数调用中。

现在,如果要在项目的其他任何位置使用该构建器,也可以重复使用该构建器。

希望它有意义,否则我可以添加一些示例代码。让我知道!

最新更新