Controladores de prueba

Probar sus controladores se hace más conveniente con un par de nuevas clases y rasgos de ayuda. Al probar los controladores, puede ejecutar el código dentro de un controlador, sin ejecutar primero todo el proceso de arranque de la aplicación. Muchas veces, usando las Herramientas de prueba de funciones será más simple, pero esta funcionalidad está aquí en caso que lo necesites.

Nota

Because the entire framework has not been bootstrapped, there will be times when you cannot test a controller Por aquí.

El rasgo del ayudante

Para habilitar las pruebas de controlador, necesita usar el rasgo ControllerTestTrait dentro de sus pruebas:

<?php

namespace App\Controllers;

use Higgs\Test\CIUnitTestCase;
use Higgs\Test\ControllerTestTrait;
use Higgs\Test\DatabaseTestTrait;

class FooControllerTest extends CIUnitTestCase
{
    use ControllerTestTrait;
    use DatabaseTestTrait;
}

Una vez que se ha incluido el rasgo, puede comenzar a configurar el entorno, incluidas las clases de solicitud y respuesta, el cuerpo de la solicitud, URI y más. Usted especifica el controlador a usar con el método controller(), pasando el nombre de clase completo de su controlador. Finalmente, llame al método execute() con el nombre del método. para ejecutar como parámetro:

<?php

namespace App\Controllers;

use Higgs\Test\CIUnitTestCase;
use Higgs\Test\ControllerTestTrait;
use Higgs\Test\DatabaseTestTrait;

class ForumControllerTest extends CIUnitTestCase
{
    use ControllerTestTrait;
    use DatabaseTestTrait;

    public function testShowCategories()
    {
        $result = $this->withURI('http://example.com/categories')
            ->controller(ForumController::class)
            ->execute('showCategories');

        $this->assertTrue($result->isOK());
    }
}

Métodos auxiliares

controlador($clase)

Especifica el nombre de clase del controlador a probar. El primer parámetro debe ser un nombre de clase completo. (es decir, incluya el espacio de nombres):

<?php

$this->controller(\App\Controllers\ForumController::class);

ejecutar(cadena $método, …$parámetros)

Ejecuta el método especificado dentro del controlador. El primer parámetro es el nombre del método a ejecutar:

<?php

$results = $this->controller(\App\Controllers\ForumController::class)
    ->execute('showCategories');

Al especificar el segundo parámetro y los siguientes, puede pasarlos al método del controlador.

Esto devuelve una nueva clase auxiliar que proporciona una serie de rutinas para comprobar la respuesta misma. Vea abajo para detalles.

con configuración ($ configuración)

Le permite pasar una versión modificada de app/Config/App.php para probar con diferentes configuraciones:

<?php

$config              = new \Config\App();
$config->appTimezone = 'America/Chicago';

$results = $this->withConfig($config)
    ->controller(\App\Controllers\ForumController::class)
    ->execute('showCategories');

Si no proporciona uno, se utilizará el archivo de configuración de la aplicación de la aplicación.

withRequest($solicitud)

Le permite proporcionar una instancia IncomingRequest adaptada a sus necesidades de prueba:

<?php

$request = new \Higgs\HTTP\IncomingRequest(
    new \Config\App(),
    new \Higgs\HTTP\URI('http://example.com'),
    null,
    new \Higgs\HTTP\UserAgent()
);

$request->setLocale($locale);

$results = $this->withRequest($request)
    ->controller(\App\Controllers\ForumController::class)
    ->execute('showCategories');

Si no proporciona uno, se pasará una nueva instancia de IncomingRequest con los valores predeterminados de la aplicación. en su controlador.

withResponse($respuesta)

Le permite proporcionar una instancia de Respuesta:

<?php

$response = new \Higgs\HTTP\Response(new \Config\App());

$results = $this->withResponse($response)
    ->controller(\App\Controllers\ForumController::class)
    ->execute('showCategories');

Si no proporciona una, se pasará una nueva instancia de respuesta con los valores predeterminados de la aplicación. en su controlador.

withLogger($logger)

Le permite proporcionar una instancia de Logger:

<?php

$logger = new \Higgs\Log\Handlers\FileHandler();

$results = $this->withResponse($response)
    ->withLogger($logger)
    ->controller(\App\Controllers\ForumController::class)
    ->execute('showCategories');

Si no proporciona uno, se pasará una nueva instancia de Logger con los valores de configuración predeterminados. en su controlador.

withURI(cadena $uri)

Le permite proporcionar un nuevo URI que simule la URL que visitaba el cliente cuando se ejecutó este controlador. Esto es útil si necesita verificar segmentos de URI dentro de su controlador. El único parámetro es una cadena. representando un URI válido:

<?php

$results = $this->withURI('http://example.com/forums/categories')
    ->controller(\App\Controllers\ForumController::class)
    ->execute('showCategories');

Es una buena práctica proporcionar siempre el URI durante las pruebas para evitar sorpresas.

Nota

Since v7.4.0, this method creates a new Request instance with the URI. Porque la instancia de Solicitud debería tener la instancia de URI. También si el nombre de host en la cadena URI no es válida con Config\App, el nombre de host válido será colocar.

withBody($cuerpo)

Le permite proporcionar un cuerpo personalizado para la solicitud. Esto puede resultar útil al probar controladores API donde debe establecer un valor JSON como cuerpo. El único parámetro es una cadena que representa el cuerpo de la solicitud:

<?php

$body = json_encode(['foo' => 'bar']);

$results = $this->withBody($body)
    ->controller(\App\Controllers\ForumController::class)
    ->execute('showCategories');

Comprobando la respuesta

ControllerTestTrait::execute() devuelve una instancia de TestResponse. Ver Respuestas de prueba en cómo utilizar esta clase para realizar afirmaciones y verificaciones adicionales en sus casos de prueba.

Prueba de filtro

Similar a Controller Testing, el marco proporciona herramientas para ayudar a crear pruebas para personalizado Filtros y sus proyectos los utilizan en el enrutamiento.

El rasgo del ayudante

Al igual que con el Probador del controlador, debe incluir FilterTestTrait en su prueba. casos para habilitar estas características:

<?php

namespace App\Filters;

use Higgs\Test\CIUnitTestCase;
use Higgs\Test\FilterTestTrait;

class FooFilterTest extends CIUnitTestCase
{
    use FilterTestTrait;
}

Configuración

Debido a la superposición lógica con las pruebas del controlador, FilterTestTrait está diseñado para trabaje junto con ControllerTestTrait si necesita ambos en la misma clase. Una vez que se haya incluido el rasgo, CIUnitTestCase detectará su método setUp y Prepare todos los componentes necesarios para sus pruebas. Si necesita una configuración especial puede modificar cualquiera de las propiedades antes de llamar a los métodos de soporte:

  • $request Una versión preparada del servicio predeterminado IncomingRequest

  • $response Una versión preparada del servicio predeterminado ResponseInterface

  • $filtersConfig La configuración predeterminada Config\Filters (nota: el descubrimiento lo manejan Filters, por lo que esto no incluirá los alias de los módulos)

  • $filters Una instancia de Higgs\Filters\Filters usando los tres componentes anteriores

  • $collection Una versión preparada de RouteCollection que incluye el descubrimiento de Config\Routes

La configuración predeterminada generalmente será la mejor para sus pruebas, ya que emula mejor un proyecto «en vivo», pero (por ejemplo) si desea simular un filtro que se activa accidentalmente en una ruta sin filtrar, puede agregarla a la configuración:

<?php

namespace App\Filters;

use Higgs\Test\CIUnitTestCase;
use Higgs\Test\FilterTestTrait;

final class FooFilterTest extends CIUnitTestCase
{
    use FilterTestTrait;

    protected function testFilterFailsOnAdminRoute()
    {
        $this->filtersConfig->globals['before'] = ['admin-only-filter'];

        $this->assertHasFilters('unfiltered/route', 'before');
    }

    // ...
}

Comprobación de rutas

El primer método auxiliar es getFiltersForRoute() que simulará la ruta proporcionada. y devolver una lista de todos los filtros (por su alias) que se habrían ejecutado para la posición dada («antes» o «después»), sin ejecutar realmente ningún controlador o código de enrutamiento. Esto tiene una gran ventaja de rendimiento sobre el controlador y las pruebas HTTP.

getFiltersForRoute($route, $position)
Parámetros:
  • $route (string) – El URI a verificar

  • $position (string) – El método de filtro a verificar, «antes» o «después»

Devuelve:

Alias para cada filtro que se habría ejecutado

Tipo del valor devuelto:

cadena[]

Ejemplo de uso:

<?php

$result = $this->getFiltersForRoute('/', 'after'); // ['toolbar']

Llamar a métodos de filtro

Las propiedades descritas en Configuración están configuradas para garantizar el máximo rendimiento sin interferencias o interferencias de otras pruebas. El siguiente método auxiliar devolverá un invocable método que utiliza estas propiedades para probar su código de filtro de forma segura y verificar los resultados.

getFilterCaller($filter, $position)
Parámetros:
  • $filter (FilterInterface|string) – la instancia, clase o alias del filtro

  • $position (string) – El método de filtro a ejecutar, «antes» o «después»

Devuelve:

Un método invocable para ejecutar el evento Filter simulado

Tipo:

Cierre

Ejemplo de uso:

<?php

namespace App\Filters;

use Higgs\Test\CIUnitTestCase;
use Higgs\Test\FilterTestTrait;

final class FooFilterTest extends CIUnitTestCase
{
    use FilterTestTrait;

    protected function testUnauthorizedAccessRedirects()
    {
        $caller = $this->getFilterCaller('permission', 'before');
        $result = $caller('MayEditWidgets');

        $this->assertInstanceOf('Higgs\HTTP\RedirectResponse', $result);
    }
}

Observe cómo el Cierre puede tomar parámetros de entrada que se pasan a su método de filtro.

Afirmaciones

Además de los métodos auxiliares anteriores, FilterTestTrait también viene con algunas afirmaciones. para optimizar sus métodos de prueba.

afirmarfiltro()

El método assertFilter() comprueba que la ruta dada en la posición utilice el filtro (por su alias):

<?php

// Make sure users are logged in before checking their account
$this->assertFilter('users/account', 'before', 'login');

afirmarNotFilter()

El método assertNotFilter() comprueba que la ruta dada en la posición no utilice el filtro (por su alias):

<?php

// Make sure API calls do not try to use the Debug Toolbar
$this->assertNotFilter('api/v1/widgets', 'after', 'toolbar');

afirmarHasFilters()

El método assertHasFilters() comprueba que la ruta dada en la posición tenga al menos un conjunto de filtros:

<?php

// Make sure that filters are enabled
$this->assertHasFilters('filtered/route', 'after');

afirmarNotHasFilters()

El método assertNotHasFilters() comprueba que la ruta dada en la posición no tenga filtros establecidos:

<?php

// Make sure no filters run for our static pages
$this->assertNotHasFilters('about/contact', 'before');