Hello, hello,

Est-ce que l'un d'entre vous a déjà rencontré ce soucis ?
J'ai ce test :

 $instance = new Invoice();
 Stub::on($instance)->method('get_ht')->andReturn(23.8);
 expect($instance->get_ht())->toBe(23.8);

Avec Invoice qui est dans un namespace du type \Classes\MyProject\Accountancy\Invoice, ce namespace est bien "usé" en haut de mon test.
Mais quand je lance mon test, j'ai ce résultat :

 ✘ it should addition 1+2
    expect->toBe() failed in `/spec/lib/classes/myproject/accountancy/InvoiceSpec.php` line 26

    actual:
      (double) 0
    expected:
      (double) 23.8

Pourtant, je m'inspire très fortement de la doc, mais rien n'a faire.
Je précise que si je lance un test basique genre 1 + 1 = 2, ça fonctionne bien. Mais impossible de Stubber mes objets.
Quelqu'un aurait une piste ?
Je précise aussi que mon code source n'est pas dans un répertoire "src", mais dans un répertoire "lib", et que j'ai un Autoloader à part de celui de composer, mais a priori, à l'exécution, il connait ma classe, ça ne semble pas être le problème, mais vu que ça diffère des exemples généraux, je le précise quand même ;)

Merci d'avance pour votre aide ;)

9 réponses


quenti77
Réponse acceptée

Je trouve ça un peu dommage de ne pas utiliser d'autoloader car c'est très simple à mettre en place et ça permet d'avoir une structure propre.
Si on reprends ton architecture tu pourrais donc avoir ceci :

/libs
    /Classes
    /Managers
    /Pdos

(Même si je trouve ces noms un peu bizarre car un dossier classes mais alors que contient managers si ce n'est pas des classes ?)

Ensuite tu n'aurais plus qu'a créer le fichier composer.json comme ceci :

{
    "name": "piolet/name",
    "description": "description",
    "autoload": {
        "psr-4": {
            "Core\\": "src/"
        }
    },
    "minimum-stability": "stable",
    "require": {}
}

Un petit composer dump-autoload et tu n'a plus qu'un seul require à faire et Kahlan en plus utilisant surement aussi ce même require aura accès à tes classes directement.
Et tout ça sans lib externe ^^

Effectivement si tu n'utilise pas l'autoloader de composer il ne peut pas greffer son comportement pour stuber tes classes. Il y a une raison particulière qui fasse que tu n'utilise pas l'autoloader de composer ?

piolet
Auteur

la seule raison que je me connaisse, c'est que je n'utilise aucun framework, rien du tout, nada. Du coup, tout ce que je développe, je pars de 0 à chaque fois (j'aime bien maitriser mes petits bouts de code). Bref.
Et en fait, au départ, j'avais pas de namespace, juste des classes, et un include.php bidon ou j'includais tous les fichiers dont j'avais besoin.
Puis, avec le temps, je me suis dit que c'était vraiment porcho, donc j'ai rajouté les namespaces à mon projet et un autoloader artisanal, mais fonctionnel.

Puis, j'ai voulu faire des tests unitaires, donc j'ai du installer des trucs avec composer. Et là, paf... il me sort un autre Autoloader qui ne semble pas faire bon ménage avec le mien.

Je crois que j'avais du trafiquer l'autoloader pour la génération de PDF à partir d'un code html (un truc récupéré aussi via composer).

Donc je vais ptet devoir modifier quelque chose dans le même style. Mais ou et comment ? 2 grandes questions ;)

(et merci pour ta réponse ;) )

Tu as "un namespace dans un dossier" ? Si tu respecte la bonne structure tu peux générer l'autoloader de composer sans forcément avoir de librairies externes. Sinon je crois qu'il y a une mention à un autoloader personnalisé dans la doc mais ça me semble un peu chiant à mettre en place.

piolet
Auteur

Disons que, mon répertoire “lib" va contenir plusieurs répertoires, par exemples "classes", "managers", "pdos", etc.
Et chacun de ces répertoires, sera un namespace particulier.
\Classes\MyProject\MyClass dans un fichier my.class.php
\Managers\MyProject\MyManager dans un fichier my.manager.php

etc.

Mais ce qui est bizarre du coup, c'est que Kahlan est capable de me dire si ma classe n'existe pas, genre si je fais ça :

 $instance = new Invoicetutut();
 Stub::on($instance)->method('get_ht')->andReturn(23.8);
 expect($instance->get_ht())->toBe(23.8);

Il est capable de me dire que Invoicetutut est une class qu'il ne connait pas.
Donc en gros, mes choses à moi semblent bien importées, puisqu'il connait ma classe.
D'après toi, je dois aller trafiquer un peu l'autoload de Kahlan pour que lui, en interne, puisse voir mes classes ?
J'avais rajouté l'option

--src="lib"

mais je crois que ça lui en touche une sans faire bouger l'autre ;)

piolet
Auteur

c'est ce que j'étais en train de faire justement ;)
en ayant pris soin de lire le tuto sur composer avant ;)

piolet
Auteur

bon bah j'ai fait un test, et comme ça, le test passe.

Je suis bon pour modifier toute ma structure. Mais je pense que c'est un mal pour un bien ;)

Je confirme ^^

Confronté au soucis, et si on ne veut pas surcharger le composer.json, on peut utiliser le fichier config de kahlan:

https://kahlan.github.io/docs/config-file.html

Exemple ici

;-)

Ce 'vieux' thread m'a été bien utile pour résoudre ce cas... Merci Piolet, et bien-sûr, GA :-) !