[HELP] Tests unitaire

Bon désolé d’avance si mes questions sont basiques ( pour les devs de métier )

@cicoub13 m’a filé un coup de main :pray: sur la PR concernée . mais noob oblige je m’en sort pas

Je dois tester ce fichier:
[FRONT] Box Humidity in Room by VonOx · Pull Request #1045 · GladysAssistant/Gladys · GitHub

C’est en partie fait.

Il me reste a tester le cas ou aucunes valeurs ( humidité ) n’est dispo pour une pièce donnée.

Comment dois je faire ?

J’ai essayé d’ajouté une room + un device + device feature ( sans valeurs ) dans les seed mais ça foire les autres tests ( room / device etc…) Donc j’ai l’impression que ce n’est pas la bonne méthode.

Si j’exploite la seule pièce dispo dans les tests ( kitchen ) le test fail car une valeur est retournée ( normal ).

Je préfère demander même si c’est vraiment basique car je suis face à un mur.

Tu peux créer une pièce juste dans ton test tout simplement :slight_smile: quand c’est juste pour un seul test il vaut mieux éviter de créer des seeds globaux

Ok on avance j’ai fait ça: surement crado mais bon

it('should ask the humidity in a room with no values', async () => {
    const brain = {
      addRoom: fake.returns(null),
      removeRoom: fake.returns(null),
    };
    const stateManager = new StateManager(event);
    const deviceManager = new Device(event, messageManager, stateManager, {});
    const serviceManager = new ServiceManager({}, stateManager);
    const room = new Room(brain);
    await room.create('test-house', {
      name: 'No value Room',
    });
    const roomFound = await room.getBySelector('no-value-room');
    const device = new Device(event, {}, stateManager, serviceManager);
    await device.create({
      id: '7bbe2ed8-e7c7-4b89-8421-b52fea5491ef',
      name: 'HUMIDITY DEVICE',
      selector: 'humidity-device',
      external_id: 'humidity-device-external',
      service_id: 'a810b8db-6d04-4697-bed3-c4b72c996279',
      room_id: roomFound.id,
      created_at: '2021-02-12 07:49:07.556 +00:00',
      updated_at: '2021-02-12 07:49:07.556 +00:00',
      features: [
        {
          id: '984d23b0-3508-4d9e-ba91-63cfc3f9e536',
          name: 'Test humidity sensor null',
          selector: 'test-humidity-sensor-null',
          external_id: 'humidity-sensor:2',
          category: 'humidity-sensor',
          type: 'humidity',
          unit: 'percent',
          read_only: false,
          has_feedback: false,
          min: 0,
          max: 100,
          last_value: null,
          last_value_changed: new Date().toISOString(),
          device_id: '7bbe2ed8-e7c7-4b89-8421-b52fea5491ef',
        },
      ],
    });
    const message = {};
    await deviceManager.humiditySensorManager.command(
      message,
      {
        intent: 'humidity-sensor.get-in-room',
        entities: [
          {
            sourceText: 'No value Room',
            entity: 'room',
          },
        ],
      },
      {
        room: roomFound.id,
      },
    );
    assert.calledWith(messageManager.replyByIntent, message, 'humidity-sensor.get-in-room.fail.no-results', {
      room: roomFound.id,
      roomName: 'No value Room',
      humidity: null,
      unit: 'percent',
    });
  });

Je penses ne pas être loin

Le log:

2021-03-12T14:00:11+0100 <debug> device.notify.js:20 (DeviceManager.notify) Notify device humidity-device creation
2021-03-12T14:00:11+0100 <warn> device.notify.js:33 (DeviceManager.notify) Service a810b8db-6d04-4697-bed3-c4b72c996279 was not found.
2021-03-12T14:00:11+0100 <debug> humidity-sensor.getHumidityInRoom.js:21 (HumiditySensorManager.getHumidityInRoom) Getting average humidity in room de14c6bf-d739-479f-a3f2-85ab783b68ed
2021-03-12T14:00:11+0100 <debug> humidity-sensor.command.js:37 (HumiditySensorManager.command) NoValuesFoundError: No humidity values found in this room.
    at HumiditySensorManager.command (/home/vonox/repos/GladysFork/server/lib/device/humidity-sensor/humidity-sensor.command.js:26:17)
    at async Context.<anonymous> (/home/vonox/repos/GladysFork/server/test/lib/device/humidity-sensor/humidity-sensor.test.js:113:5)
    1) should ask the humidity in a room with no values

A priori le resultat est là => NoValuesFoundError: No humidity values found in this room.

Mais

image

Encore cette histoire de contexte que je pensais avoir compris , comment se lit cet output ?

EDIT: en vert ce qui est attendu et rouge ce qui a été produit/reçu ?

Ce n’est pas crado ! Au contraire c’est mieux de créer son petit scénario dans son test, je trouve ça bien moi :slight_smile:

Effectivement c’est ça

Ok j’avais peur d’avoir compris :smiley: , du coup je comprends pas ce que la cuisine vient faire là dedans ^^

lol qui l’eu cru, dev ressemble à un vrai métier ?? :stuck_out_tongue:

Tu veux qu’on binome ?

1 « J'aime »

On va pas allez jusque là :rofl:

Pas forcément ( t’as d’autres chats à fouetter ) .

Ce que je veux surtout pas c’est avoir la solution clé en main sans comprendre.

Bon après quelques essais, j’ai toujours pas compris pourquoi le code me renvoi les infos d’une autre Room.

J’ai mis du logger partout pour tester le test ^^ !

D’ailleurs c’est vraiment curieux car le retour en rouge est celui du 1er test.

Je prends ta branche en local pour tester, je te dis.

1 « J'aime »

@VonOx

Je te conseille d’ajouter dans VSCode la possibilité d’exécuter en debug le fichier de test, et de pouvoir ajouter des points d’arrêt pour voir ce qu’il se passe tout le long du process.

tu ajoutes dans le fichier

    {
      "type": "node",
      "request": "launch",
      "name": "NodeJS test current file",
      "runtimeArgs": [
        "${workspaceFolder}/server/node_modules/mocha/bin/mocha",
        "--timeout",
        "999999",
        "--colors",
        "${workspaceFolder}/server/test/bootstrap.test.js",
        "${file}",
        "--exit"
      ],
      "console": "integratedTerminal",
      "env": {
        "NODE_ENV": "test",
        "SQLITE_FILE_PATH": "/tmp/gladys-test.db"
      }
    },

Ensuite, la petite flèche verte pour lancer le fichier ouvert en mode debug, en ayent les breakpoint… toussa toussa

1 « J'aime »

J’ai pas push le bout de test que j’ai mis plus haut ( merci :slight_smile: )

Yes je l’ai récupéré, j’ai bien l’erreur.

Juste avant de continuer, quand tu utilises les “fake” de sinon,
il faut bien penser à reset sinon avec

  afterEach(() => {
    sinon.reset();
  });

Dans la fonction command que tu créé, tu remonte une NoValuesFoundError si ton device n’a pas de valeur (cas de test si dessus).

Mais le context est “rempli” après l’erreur.

Le contexte est donc

    {
      room: roomFound.id,
    }

sans tout le reste autour.

Ton test n’est pas mauvais, mais il y a un écart entre ce que tu fais dans command et le résultat que tu attends.

Ligne 37, ajoute le “context” dans ton debug, tu verras :wink:

Ok pigé merci Alex, j’ai viré la création du device ça servait à rien :slight_smile:

1 « J'aime »