Bonjour,

Voila tout est dans le titre ;)
Est-ce que quelqu'un à déjà réussi à mocker un objet Datetime avec Kahlan ?
C'est tout bête, enfin tout du moins, c'est la base pour bien faire ces tests unitaires, mais je ne trouve rien sur le web.
La doc ayant récemment été "délocalisée", je ne trouve plus vraiment d'exemple.
Et visiblement, sur Stackoverflow, les utilisateurs ne sont pas trop adeptes de Kahlan.

Donc j'en demande à vot' bon coeur ;)

12 réponses


piolet
Auteur
Réponse acceptée

Et qui c'est le boulet ???
C'est Bibi.

Je faisais mon allow après l'appel de la méthode que je voulais tester. Du coup, aucun effet, tout bêtement. Mais à trop avoir le nez dessus, on ne voit plus rien.

Désolé de t'avoir dérangé pour ça du coup. :/

piolet
Auteur

Ah oui, petite précision, je bute sur comment mocker un

new Datetime()

Tout bête. L'idéal serait que je n'ai pas à modifier mon code pour rajouter un paramètre (que je pourrais mocker plus facilement).

Tu pourrais mettre un petit bout de code pour que je vois ce que tu cherche à tester et voir si c'est possible ?

piolet
Auteur

Bien entendu, voici le code en question :

$params = $product->to_paypal_params(0);
//Essais de mock
allow('time')->toBeCalled()->andReturn(123); 
// Monkey::patch('time', function() { return strtotime('2016-10-28 12:14:27'); });
expect(count($params))->toBe(19);
expect(...);
expect($params["PROFILESTARTDATE"])->toBe("2016-11-28T12:14:27+02:00");`

L'idée est donc que mon product est converti en tableau pour paypal. Suivant différent critères, pour la récurrence, la date peut changer (+1 jour, +1 mois ou +1 année).

A l'intérieur de mon Product, la date en question est construite comme ça :

$date_tmp = new \DateTime();
$start = $date_tmp->add(new \DateInterval($interval))->getTimestamp();

Puis ensuite elle est formatée. Du coup, je voudrais mocker le constructeur du DateTime, pour lui donner une date connue, et donc en déduire la date calculée.

You know what i mean ? ;)

Avec la nouvelle version de Kahlan c'est plutot simple maintenant

<?php

describe("Demo Class", function() {

    it("makes an expectation", function() {
        allow('DateTime')->toBe(new DateTime('2010-10-10'));
        $demo = new \App\Demo();
        expect($demo->getDate())->toBe('10/10/2010');
    });

});
piolet
Auteur

Avec ce code de création, donc avec l'antislash, dans mon Product :

$date_tmp = new \DateTime();

et ce code dans le test :

allow('DateTime')->toBe(new \DateTime('2016-10-28 12:14:27'));

J'obtiens ceci :

it should have params for paypal with first recurrent product
      expect->toBe() failed in `./spec/Objects/Common/ProductSpec.php` line 254

      It expect actual to be identical to expected (===).

      actual:
        (string) "2016-12-03T12:42:37+01:00"
      expected:
        (string) "2016-11-28T12:14:27+02:00"

Il sort donc en résultat la date du jour.

Un problème avec l'antislash ou bien ? à ton avis ?

Mmmh essaie de mettre l'antislash dans le allow sinon poste une issue sur github (ou si tu es motivé écris un test pour produire ce bug et fait une PR)

piolet
Auteur

Bon bah j'ai essayé, a priori :

allow('\DateTime')->toBe(new \DateTime('2016-10-28 12:14:27'));

ça me renvoie toujours la date du jour... Tu parles d'un mock ;)
Pour ma culture, c'est quoi "PR" ?

piolet
Auteur

Pour ceux que ça pourrait intéresser : L'issue sur github

piolet
Auteur

Bon, il me demande, si je comprends bien, mais je suis une burne en anglais, de faire un repository.
Or, outre mon incompétence à manier GitHub correctement (je ne l'utilise que pour récupérer des codes), je ne suis pas trop sûr que je puisse déposer l'ensemble de mon code (Plusieurs centaines de classes, pour un projet qui ne doit pas non plus être exposé).

Bref, je suis un peu dans une little impasse :/

Télécharge son dépot : https://github.com/jails/temp et essaie son code il marche.
Vérifie ce qui change par rapport à ta façon de faire.

piolet
Auteur

Ok, je vais essayer ça ce soir ;)