Testing CakePHP 3.6控制器集成测试-未发送HTTP请求

Testing CakePHP 3.6控制器集成测试-未发送HTTP请求,testing,cakephp,phpunit,Testing,Cakephp,Phpunit,我正在尝试使用CakePHP3.6的测试工具实现控制器集成测试。我假设这可以通过对正在运行的Web服务器发出一个“真实的”CURL HTTP请求来处理,但看起来不是这样。下面是我正在使用的测试用例代码 我遇到的问题是: 测试用例正在设法访问控制器操作, 即使Web服务器根本没有运行,Apache也会停止运行 开发Web服务器正在运行。 运行此测试时,控制器无权访问 $\请参见下面的服务器,测试用例中定义的任何$postData在控制器端显示为空。 当我放置出口时;在控制器代码中,整个测试用例 停

我正在尝试使用CakePHP3.6的测试工具实现控制器集成测试。我假设这可以通过对正在运行的Web服务器发出一个“真实的”CURL HTTP请求来处理,但看起来不是这样。下面是我正在使用的测试用例代码

我遇到的问题是:

测试用例正在设法访问控制器操作, 即使Web服务器根本没有运行,Apache也会停止运行 开发Web服务器正在运行。 运行此测试时,控制器无权访问 $\请参见下面的服务器,测试用例中定义的任何$postData在控制器端显示为空。 当我放置出口时;在控制器代码中,整个测试用例 停止,这表明控制器代码是直接运行的,而不是 通过HTTP请求。 问题:在测试控制器时,除了使用CURL和手动处理请求之外,我如何才能发出“真正的”HTTP请求

显然,我不是不理解控制器测试是如何完成的,就是我做错了什么

我正在使用的测试用例:

/tests/TestCase/Controller/JobsControllerTest.php


CakePHP集成测试不会发出实际的HTTP请求,它们模拟这些请求,速度非常快,允许进行某些模拟、检查会话内容、访问异常详细信息等,所有这些都是不可能的,至少在使用真正的HTTP请求时不容易做到。如果您确实需要发出实际的请求,那么您应该考虑使用其他实用程序,例如专门的验收测试

使用CakePHP时,建议不要直接访问PHP superglobals,而是从CakePHP提供的抽象API中检索数据!破坏集成测试是造成这种情况的原因之一。模拟请求将收到一个请求对象,该对象已使用来自测试用例的数据准备好,您需要在那里查找它

例如,如果您想访问应用程序(可能是控制器)中的POST数据,则可以这样做:

$user_id = $this->request->getData('user_id');
另见


我可以发誓我已经检查了控制器上的请求对象,它看起来是空的。看了你的答案后再次检查,瞧!帖子数据就在那里:不过我肯定需要重构$\u服务器。谢谢你的回答-一如既往的完美!
Array
(
    [LS_COLORS] => rs=0:di=01;34 [...]
    [LANG] => en_US.UTF-8
    [HOME] => /home/tomasz
    [TERM] => screen
    [PATH] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
    [MAIL] => /var/mail/root
    [LOGNAME] => root
    [USER] => root
    [USERNAME] => root
    [SHELL] => /bin/bash
    [SUDO_COMMAND] => vendor/bin/phpunit --verbose
    [SUDO_USER] => tomasz
    [SUDO_UID] => 1000
    [SUDO_GID] => 1000
    [PHP_SELF] => vendor/bin/phpunit
    [SCRIPT_NAME] => vendor/bin/phpunit
    [SCRIPT_FILENAME] => vendor/bin/phpunit
    [PATH_TRANSLATED] => vendor/bin/phpunit
    [DOCUMENT_ROOT] =>
    [REQUEST_TIME_FLOAT] => 1546631688.0758
    [REQUEST_TIME] => 1546631688
    [argv] => Array
        (
            [0] => vendor/bin/phpunit
            [1] => --verbose
        )

    [argc] => 2
)
$user_id = $this->request->getData('user_id');