He hecho esta pregunta en StackOverflow , y se sugirió que la haga aquí.
Estoy familiarizado con las pruebas de unidad / sistema / integración, y me gustaría poder probar mi componente Joomla. ¿Hay una forma estándar de hacer esto?
Estoy trabajando en este ejemplo de componente joomla mvc , que no incluye pruebas. Todo lo que puedo encontrar en la documentación de Joomla y en varios sitios web son fragmentos de código de prueba y archivos bootstrap.php. Específicamente, lo que me gustaría saber es:
- Dónde poner el código de prueba del componente
- ¿Necesito proporcionar mi propio bootstrap.php, o hay alguna forma de 'incluir joomla' y ejecutar mis pruebas?
Idealmente, alguien podría dirigirme a un componente de código abierto de Joomla que tenga pruebas e instrucciones sobre cómo ejecutarlas (echó un vistazo rápido, los primeros 5 más o menos no tenían pruebas).
Lo más cercano que he encontrado es esto , en el que he basado mi prueba ficticia.
Lo que he hecho hasta ahora
Estructura de directorio de componentes:
- Hola Mundo/
- administración/
- ...
- pruebas /
- bootstrap.php
- phpunit.xml
- modelHelloWorldsTest.php
- sitio/
- ...
- helloworld.xml
- administración/
Primer intento
Para ejecutar las pruebas, instalo / copio el componente en mi instalación de Joomla. Luego ejecuto el siguiente comando desde ~ joomla / administration / components / com_helloworld / tests:
php phpunit-4.2.phar --bootstrap bootstrap.php .
de donde recibo
Fatal error: Class 'ContentController' not found in C:\inetpub\wwwroot\ws_cairnstest\administrator\components\com_helloworld\tests\modelsHelloWorldsTest.php on line 5
Entiendo que esto significa que mi bootstrap.php no es correcto y no ha cargado las clases necesarias de Joomla. Investigaré esto en algún momento, pero parece una gran cantidad de configuraciones solo para ejecutar algunas pruebas.
bootstrap.php:
<?php
error_reporting(E_ALL);
define('_JEXEC', 1);
define('BASEPATH',realpath(dirname(__FILE__).'/../../'));
define('JOOMLA_PATH',realpath(dirname(__FILE__).'/../../../../../'));
define('JOOMLA_ADMIN_PATH',realpath(dirname(__FILE__).'/../../../../'));
$_SERVER['HTTP_HOST'] = 'localhost';
$_SERVER['REQUEST_METHOD'] = 'GET';
if (file_exists(JOOMLA_ADMIN_PATH . '/defines.php'))
{
include_once JOOMLA_ADMIN_PATH . '/defines.php';
}
if (!defined('_JDEFINES'))
{
define('JPATH_BASE', JOOMLA_ADMIN_PATH);
require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';
require_once JPATH_BASE . '/includes/helper.php';
require_once JPATH_BASE . '/includes/toolbar.php';
define('JPATH_COMPONENT',JOOMLA_ADMIN_PATH.'/components/com_content');
$app = JFactory::getApplication('administrator');
include BASEPATH.'/controller.php';
modelsHelloWorldsTest.php:
<?php
class HelloWorldsTest extends \PHPUnit_Framework_TestCase {
public function testList(){
$c = new ContentController();
$model = $c->getModel('helloworlds');
$worlds = $model->getItems();
var_dump($worlds);
$this->assertNotEmpty($worlds);
}
}
phpunit.xml:
<phpunit bootstrap="bootstrap.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
verbose="true">
</phpunit>
Segundo intento
Después de ver esta respuesta , puse mis pruebas bajo prueba / unidad bajo mi instalación de joomla, copié phpunit.dist.xml y bootstrap.php del repositorio de joomla-cms en sus ubicaciones apropiadas, y aún obtuve el
Fatal error: Class 'ContentController' not found in C:\inetpub\wwwroot\ws_cairnstest\administrator\components\com_helloworld\tests\modelsHelloWorldsTest.php on line 5
error que estaba recibiendo antes
fuente
Error: Call to undefined method JController::getInstance()
por esto.Lo siento si mi respuesta no aborda directamente su problema, pero es importante comprender qué es la prueba de unidad y cómo usarla, sin importar si estamos hablando de Joomla o no. Has abordado muchos problemas y es bastante difícil lidiar con todos ellos.
En primer lugar, es importante leer la documentación en PHPUnit . Construya una clase pequeña (independientemente de Joomla) e intente escribir algunas pruebas para ello. Obtenga PHPUnit primero ejecutándose en tal escenario. Entiende lo que hace. Me temo que se está centrando demasiado en hacer que PHPUnit se ejecute en lugar de comprender cómo ayuda a su desarrollo.
Para que Joomla funcione , necesitará:
El error que está recibiendo es lo más claro posible. 'ContentController' claramente no está cargado automáticamente por Joomla. Verifique con un depurador si se llama al autocargador en Joomla y por qué no puede cargar la clase. En el peor de los casos, proporcione su propio cargador automático y use el archivo de arranque para llamarlo. Una solución rápida también es cargar manualmente el archivo requerido con require_once.
Decide qué quieres probar y usa maquetas
En el ejemplo proporcionado, está utilizando JModel para obtener datos de la base de datos. Esto es un no-go desde el punto de vista TDD. La prueba de que puede obtener datos de la base de datos no tiene valor en mi humilde opinión. ¿Qué estás probando exactamente allí?
Si necesita trabajar con datos de la base de datos, use simulacros para modelar una respuesta de la base de datos. De esta manera, sus pruebas tendrán un comportamiento constante con el tiempo. No desea tener pruebas fallidas solo porque cambió algo en la base de datos.
Si tiene un método que computa algunas cosas o cualquier otra cosa que tenga sentido para probar. Esta es una prueba unitaria: toma una pequeña unidad de su sistema complejo, la alimenta con datos de prueba falsos y prueba su comportamiento.
Necesita ver que su sistema funciona como un todo, use pruebas del sistema.
fuente