如何在PHPUnit中为WordPress闭包回调标记预期覆盖代码?
如何让PHPUnit识别闭包形式的WordPress钩子代码为预期覆盖内容?
问题场景
我在测试WordPress钩子/动作时,用闭包写法定义了过滤器:
add_filter("asdasd", static function() { echo 'asdf'; });
运行PHPUnit时触发报错:
This test executed code that is not listed as code to be covered or used: - /var/www/html/wp-content/themes/theme-1/init.php:123
报错指向闭包内的echo语句(第123行)。改用命名函数并添加@CoversFunction注解能解决问题,但我想保留闭包写法,同时让PHPUnit认可这是预期要覆盖的代码。
解决方案
方法1:用@uses注解标记闭包代码
闭包没有独立函数名,没法用@CoversFunction,但可以通过@uses注解声明测试会用到这段代码。在测试方法或测试类上添加:
/** * @uses /var/www/html/wp-content/themes/theme-1/init.php::123 */ public function test_asdasd_filter() { // 你的测试逻辑代码 }
如果文件内有多个闭包,也可以直接指定整个文件:
/** * @uses /var/www/html/wp-content/themes/theme-1/init.php */
方法2:在PHPUnit配置文件中添加白名单
修改项目根目录的phpunit.xml(或phpunit.xml.dist),把包含闭包的文件加入代码覆盖白名单:
<coverage> <include> <!-- 可以指定整个主题目录 --> <directory suffix=".php">wp-content/themes/theme-1/</directory> <!-- 也可以精确到单个文件 --> <file>wp-content/themes/theme-1/init.php</file> </include> </coverage>
配置后,PHPUnit会把该文件内的所有代码纳入预期覆盖范围,不会再抛出未授权代码执行的错误。
方法3:用@coversNothing跳过覆盖检查
如果你的测试不需要统计代码覆盖率,只是验证钩子的执行逻辑,可以在测试方法上添加@coversNothing,让PHPUnit跳过该测试的覆盖检查:
/** * @coversNothing */ public function test_asdasd_filter() { // 你的测试逻辑代码 }
内容的提问来源于stack exchange,提问作者Ruslan
相关产品推荐
相关产品推荐

