相关疑难解决方法(0)

使用PHPUnit测试PHP头文件

我正在尝试使用PHPunit来测试输出一些自定义标头的类.

问题是在我的机器上这个:

<?php

class HeadersTest extends PHPUnit_Framework_TestCase {

    public function testHeaders()
    {
        ob_start();

        header('Location: foo');
        $headers_list = headers_list();
        header_remove();

        ob_clean();

        $this->assertContains('Location: foo', $headers_list);
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至这个:

<?php

class HeadersTest extends PHPUnit_Framework_TestCase {

    public function testHeaders()
    {
        ob_start();

        header('Location: foo');
        header_remove();

        ob_clean();
    }
}
Run Code Online (Sandbox Code Playgroud)

返回此错误:

name@host [~/test]# phpunit --verbose HeadersTest.php 
PHPUnit 3.6.10 by Sebastian Bergmann.

E

Time: 0 seconds, Memory: 2.25Mb

There was 1 error:

1) HeadersTest::testHeaders
Cannot modify header information - headers already sent by (output started at /usr/local/lib/php/PHPUnit/Util/Printer.php:173)

/test/HeadersTest.php:9 …
Run Code Online (Sandbox Code Playgroud)

php phpunit unit-testing output-buffering

87
推荐指数
4
解决办法
3万
查看次数

我可以在PHPUnit中"模拟"时间吗?

......不知道'mock'是否是正确的词.

无论如何,我有一个继承的代码库,我正在尝试编写一些基于时间的测试.试图不要模糊,代码与查看项目的历史并确定该项目现在是否基于时间阈值有关.

在某些时候,我还需要测试在该历史记录中添加内容并检查阈值现在是否已更改(显然,更正).

我正在测试的问题是我正在测试的部分代码是使用对time()的调用,所以我发现很难确切知道阈值时间应该是什么,基于我的事实我不确定何时会调用time()函数.

所以我的问题基本上是这样的:有没有办法让我"覆盖"time()调用,或以某种方式"模仿"时间,以便我的测试在"已知时间"工作?

或者我只是必须接受这样一个事实,即我将不得不在我正在测试的代码中执行某些操作,以某种方式允许我强制它在需要时使用特定时间?

无论哪种方式,是否有任何"常见做法"来开发对测试友好的时间敏感功能?

编辑:我的问题的一部分也是历史中发生的事情影响阈值的事实.这是我的部分问题的一个例子......

想象一下,你有一个香蕉,当你需要吃它时,你正试图解决这个问题.假设它将在3天内到期,除非它喷洒了一些化学物质,在这种情况下,我们会在施用喷雾时添加4天到期.然后,我们可以通过冻结它再添加3个月,但是如果它已经冷冻,那么我们只有1天的时间来解冻它.

所有这些规则都是由历史时间决定的.我同意我可以在几秒钟内使用Dominik的测试建议,但我的历史数据是什么?我应该在飞行中"创造"吗?

正如您可能或可能无法分辨的那样,我仍然试图了解所有这些"测试"概念;)

php phpunit

69
推荐指数
5
解决办法
2万
查看次数

标签 统计

php ×2

phpunit ×2

output-buffering ×1

unit-testing ×1