【问题标题】:PHP unit testing with external functions使用外部函数进行 PHP 单元测试
【发布时间】: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


【解决方案1】:

模拟和管理此类全局函数的常用方法是将它们包装在一个可以注入和模拟的类中。

class WpGlobals
{
    public function get_the_title($id)
    {
        return get_the_title($id);
    }
}

【讨论】:

  • 啊,这很简单!
猜你喜欢
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多