Appel variable $db dans test phpUnit

Bonjour!

Je suis nouveau dans l’utilisation des test phpUnit avec Dolibarr.
Je cherche, dans un test, à appeler ma variable $db qui me permettrai de faire plus que des simples 1+1 = 2.

Seulement je ne parvient pas à appeler cette variable qui contient tout le nécessaire pour se connecter à la base de donnée.

Quel est l’include à faire pour avoir accès cette variable correctement hydratée?

Sauriez-vous m’aider?
(P.S : Je ne passe pas par Selenium, on parle bien de simples tests unitaires.

Merci d’avance!

Bonjour,

global $db;
en début du fichier test ça devrait fonctionner (j’ai pas de config sous la main pour confirmer).

Merci !

Effectivement, cela à fonctionné.
Maintenant j’ai une erreur qui à l’air de venir de la variable $conf qui est vide, même appelée via ‹ global ›.

Si jamais vous avez une idée!

Quel variable appelez vous ?
$conf->global-> nom de la variable

Pour faire plus simple, voici exactement le contenu de mon fichier de test :

use PHPUnit\Framework\TestCase;
global $db, $conf, $langs;

class EleveTest extends TestCase
{

	public function testFetchData()
	{
		require_once '../../../../main.inc.php';

		require_once '../../class/eleve.class.php';

		$eleveClass = new Eleve($db);
		$resultat = $eleveClass->fetch(2);

		$this->assertEquals('résultat attendu', $resultat);
	}
}

C’est un simple test de fetch sur une entité Élève.
Ce code ne génère absolument rien, aucune assertion ni aucun message d’erreur :

PHPUnit 10.5.3 by Sebastian Bergmann and contributors.
Runtime:       PHP 8.1.11
Process finished with exit code 0

Un var_dump placé après le require du main.inc.php n’apparait pas en sortie, ce qui me fait penser qu’il y a une erreur dans mon fichier. Pareil si j’enlève les variables globales en haut.

Est-ce une erreur de placement des appels de fichier? de variables?

(Pour info, je suis avec Dolibarr v17.0.2, PHP 8.1, en local installation fraiche avec XAMPP)

Pour le require_once
require_once DOL_DOCUMENT_ROOT.'/core/class/nom_de_la_classe

et pour le main

$res = 0;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
	$res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php";
}
// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1;
while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
	$i--; $j--;
}
if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
	$res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
}
if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
	$res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
}
// Try main.inc.php using relative path
if (!$res && file_exists("../main.inc.php")) {
	$res = @include "../main.inc.php";
}
if (!$res && file_exists("../../main.inc.php")) {
	$res = @include "../../main.inc.php";
}
if (!$res && file_exists("../../../main.inc.php")) {
	$res = @include "../../../main.inc.php";
}
if (!$res) {
	die("Include of main fails");
}

Vous aurez plus de chance que cela fonctionne

Merci.

Après avoir collé votre code, j’ai des erreurs concernant les fichiers mysqli.class.php, et functions.lib.php.

Attempt to read property « db » on null
Attempt to read property « dolibarr_main_db_collation » on null
Attempt to read property « dolibarr_main_db_collation »
Attempt to read property « file » on null
Attempt to read property « dol_document_root » on null

À chaque fois, la ligne qui génère une erreur dans les fichiers appelés inclues
$conf->qq_chose

La variable $conf semble être totalement vide.

En mettant tout en haut la variable global $db et $conf, (au dessus de la recherche de main.inc.php) :

use PHPUnit\Framework\TestCase;
global $db, $conf;

les erreurs citées ci-dessus disparaissent mais comme avant, mon test ne me ressort rien.

Merci beaucoup de m’aider!


et le main doit être en haut (sachant que normalement vous n’en avez pas besoin)

Regarder comment sont construit les class dans un autre fichier

Merci pour vos réponses et votre temps.

J’ai exactement suivi vos instructions et toujours aucun résultat.

Si j’enlève la recherche du main, une erreur apparait me disant que la constante « DOL_DOCUMENT_ROOT » n’existe pas, car elle est définie dans main justement.

J’ai même essayé depuis une installation complètement neuve en V18.0.4, et même constat, des erreurs à la variables $conf qui semble être vide.

Je continue de creuser, mais ça m’embête un peu de ne pas pouvoir faire de tests unitaires!