php - 对需要发送 header 的项目进行单元测试

标签 php unit-testing phpunit

我目前正在使用 PHPUnit 尝试开发测试以及我正在编写的内容,但是,我目前正在编写 session 管理器,并且在这样做时遇到了问题...

Session处理类的构造函数是

private function __construct()
{
    if (!headers_sent())
    {
        session_start();
        self::$session_id = session_id();
    }
}

但是,由于 PHPUnit 在开始测试之前会发送文本,因此对该对象的任何测试都会返回失败的测试,因为 HTTP“ header ”已被发送...

最佳答案

嗯,您的 session 管理器基本上是被设计破坏的。为了能够测试某些东西,必须能够将其与副作用隔离开来。不幸的是,PHP 的设计方式是鼓励自由使用全局状态(echoheaderexitsession_start 等等等等)。

您能做的最好的事情是隔离组件中的副作用,这些副作用可以在运行时进行交换。这样,您的测试可以使用模拟对象,而实时代码使用具有真正副作用的适配器。您会发现这不适用于单例,我认为您正在使用单例。因此,您必须使用一些其他机制来将共享对象分发到您的代码中。您可以从静态注册表开始,但如果您不介意学习一点,还有更好的解决方案。

如果您不能这样做,您始终可以选择编写集成测试。例如。使用 PHPUnit 的 WebTestCase .

关于php - 对需要发送 header 的项目进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/190292/

相关文章:

php - 在 yii2 基本应用程序的供应商文件夹中找不到 Bower 文件夹

php - 如何在没有 PHPUnit 的情况下使用 PHP_CodeCoverage?

php - 使用 PHPUnit 在 php 中测试关闭例程 (register_shutdown_function)

python - 如何在 Django 单元测试中输出完整差异?

javascript - 开 Jest 期望一个内部有函数的对象

php - 数据提供的最佳实践 - PHPUnit

php - 多个测试在 phing 中发生冲突

php - 如何在mysql的每一行中插入file_name作为值?

javascript - 访问存储在对象中的数据

php - 在单元测试 Laravel 期间保存变量