Test unitaire en dart

Bonjour,
J’ai voulu mettre en pratique la leçon sur les tests.
J’ai une fonction utilitaire qui me calcule un âge à partir d’une date passée en paramètre.
Je ne sais pas comment faire le test, puisque la réponse change tous les jours !

Voici la fonction :

String calculerAge(DateTime dateDeNaissance) {
  final DateTime datePresente = DateTime.now();

  final age = datePresente.difference(dateDeNaissance).inDays ~/
      Constantes.anneeSolaire;
  final jours = (datePresente.difference(dateDeNaissance).inDays %
          Constantes.anneeSolaire)
      .toInt();
  return "$age ans,  $jours jour(s)";

Salut @gilles57,

En faite, ton problème vient de DateTime.now(), donc il faut que tu utilises une des méthodes de la documentation ci-dessous, afin de comparer si tu as le même résultat à la fin.

Merci @ThonyF ,
J’ai bien regardé la doc, mais je ne vois pas comment faire sans toucher à ma fonction.

[ÉDIT] j’ai fait mon test comme ceci, mais je ne sais pas si c’est pertinent !

 test("Test Calcul d'âge", () {
    expect(calculerAge(DateTime.now()), "0 ans, 0 jour(s)");
  });

Alors, on va appliquer la méthode de développement orienté par les tests, c’est-à-dire qu’on commence par les tests et après on code.

Donc, tu crées une fonctionne de test comme celle que tu as faite sans abstractions.

  final DateTime datePresente = DateTime.now();

  final age = datePresente.difference(2000).inDays ~/
      Constantes.anneeSolaire;
  final jours = (datePresente.difference(2000).inDays %
          Constantes.anneeSolaire)
      .toInt();

 final resultatString =  "$age ans,  $jours jour(s)"

Et en dessous, tu ajoutes ton test calculerAge(2000) = resultatString

Je suis désolé, mais je ne comprends pas !
(et datePresente.difference() attend un DateTime, pas un int.)

Ok, alors rajoute une constante pour remplacer les 2000 que j’ai mis.

C’est bien ça, tu donnes une date (dateDeNaissance) et tu fais quelque chose avec ?

EDIT : D’ailleurs si tu rajoutes une constante, tu pourras l’utiliser pour ton test c’est même mieux :

Test(calculerAge(CONSTANTE) = resultatString) retour TRUE ou FALSE

C’est pertinent, si tu veux tester ta string, mais elle ne teste rien d’autre.

Je ne comprends toujours pas comment on s’affranchit de la partie variable introduite par le now().

Tu ne peux pas t’en affranchir, car tu l’utilises dans ta fonctionne. À moins de modifier cette fonctionne en ajoutant un paramètre supplémentaire, afin de permet de passer une date immuable ou muable comme tu le désire.

Sinon, tu es obligé de l’utiliser dans ta fonction de test pour créer les conditions réelles.

D’accord, là je crois que j’ai compris.
Merci pour les explications.
Pour mon premier test, je n’ai pas choisi la facilité. :wink: