vendredi 4 janvier 2019

CakePHP 3.6 Controller Integration Testing - HTTP requests not sent

I am trying to implement controller integration testing in CakePHP 3.6 using its testing tools. I assumed that this would be handled by making a 'real' (as in CURL) HTTP request against the running webserver, but it looks like it isn't. Below is the test case code I'm using.

The problems I'm running into:

  1. The test case is somehow managing to access the controler action, even when the webserver is not running at all (Apache down and no dev webserver running).
  2. When running this test, the controller does not have access to $_SERVER (see below) and any of the $postData defined in the test case appears empty on the controller side.
  3. When I place exit; in the controller code, the whole test case stops, which suggests that the controller code is run directly, not via a HTTP request.

Question: How can I make a 'real' HTTP requests when testing controllers, apart from resorting to using CURL and handling the requests manually?

Clearly, I am either not understanding how the controller testing is done, or I'm doing something wrong.

Test case I'm using:

/tests/TestCase/Controller/JobsControllerTest.php

<?php
namespace App\Test\TestCase\Controller;

use Cake\ORM\TableRegistry;
use Cake\TestSuite\IntegrationTestCase;

/**
 * App\Controller\JobsController Test Case
 */
class JobsControllerTest extends IntegrationTestCase
{

    /**
     * Test add method
     *
     * @return void
     */
    public function testAdd()
    {
        $this->useHttpServer(true);

        $this->configRequest([
            'headers' => [
                'Content-Type' => 'application/json',
                'X-Api-Key' => '8f083c8f083c8f083c8f083c'
            ]
        ]);
        $postData = [
            'user_id' => 3,
            'job_status' => 'New'
        ];
        $this->post('/jobs/add', $postData);

        $this->assertResponseSuccess();
        $jobs = TableRegistry::get('Jobs');
        $query = $jobs->find()->where(['user_id' => $postData['user_id']]);
        $this->assertEquals(1, $query->count());
    }

}

The dump of $_SERVER global from the controller that I'm testing:

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
)

Aucun commentaire:

Enregistrer un commentaire