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 predeterminadoIncomingRequest
$response
Una versión preparada del servicio predeterminadoResponseInterface
$filtersConfig
La configuración predeterminadaConfig\Filters
(nota: el descubrimiento lo manejanFilters
, por lo que esto no incluirá los alias de los módulos)$filters
Una instancia deHiggs\Filters\Filters
usando los tres componentes anteriores$collection
Una versión preparada deRouteCollection
que incluye el descubrimiento deConfig\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');