【发布时间】:2022-01-01 11:53:39
【问题描述】:
我正在尝试为 PHP Wordpress 项目编写单元测试,但在模拟外部函数调用时我很难掌握一些概念,而且我不确定我需要做什么。
这是我创建的课程的一个非常简单的版本:
class Module
{
private $title;
public __construct($id = false)
{
$this->title = get_the_title($id); // core wp function
}
public get_title()
{
return $this->title;
}
}
我想像这样测试它:
class ModuleTests extends TestCase
{
public test_get_title_returns_title_if_id()
{
$module = new Module(1);
$this->assertSame($module->get_title(), 'A Test Title'); // should equal true
}
public test_get_title_returns_empty_string_if_no_id()
{
$module = new Module();
$this->assertSame($module->get_title(), ''); // should equal true
}
}
现在显然这不能孤立地工作,因为 Module 在构造函数中使用了核心的 wordpress 函数,那么在这种情况下测试的正确方法是什么?如果将正确的参数传递给它,我是否应该用返回硬编码值的东西替换全局 get_the_title() 函数?还是有其他方法可以做到这一点?
我正试图摆脱旧的 wordpress 程序风格 PHP,以便在我从事的大型项目中使用更多的 OOP 实践,但我对它还是很陌生,所以如果我做的事情完全错误也可以随意提出建设性的批评。
另外,我知道WP已经有了模板函数the_title(),但我只是用这个作为一个简单的例子。
提前致谢!
【问题讨论】:
-
您必须决定是否要接受 WordPress 的魔力“正常工作”。您似乎在盲目地传递标题,所以可以说谁在乎,除非 WordPress 本身坏了,否则它会起作用,而您仍然坏了。对于其他领域,例如摘录,它可能很重要。如果您关心 WordPress 部分,WordPress 有一个完整的 PHPUnit 可以启动,包括制作虚假的内存帖子,但它确实有点重。如果没关系,那就模拟吧。
-
@ChrisHaas 完全同意,在这一点上,我只是想了解基础知识,然后随着我的进展越来越远。感谢您的建议!
-
重读这篇文章后,如果这被认为是轻率的,包括“盲目通过”,我很抱歉,这不是本意,只是我的字面意思。回到你的问题,我会说“基础”是你感到舒服的。 Eric 提供的是一种方法,实现完整的 WordPress 感知 PHPUnit 是另一种方法,我真的不认为有对错之分。当我们构建 WordPress 插件时,出于测试原因,我们非常非常努力地尝试在其中包含零 WordPress 代码,然后我们构建了一些将我们的代码与 WordPress 连接起来的东西。
标签: php wordpress unit-testing testing