[HILFE] Unit-Tests

Entschuldigung im Voraus, wenn meine Fragen grundlegend sind (für Berufsentwickler)

@cicoub13 hat mir geholfen :pray: bei der PR. Aber als Noob komme ich nicht weiter.

Ich muss diese Datei testen:
https://github.com/GladysAssistant/Gladys/pull/1045/files#diff-1e5ef582cb3ebc70e2b396ec31c6116178f1a41b6434f178ae83f0fdd0350ca0

Das ist teilweise erledigt.

Mir bleibt noch der Fall, in dem keine Werte (Feuchtigkeit) für einen bestimmten Raum verfügbar sind.

Wie soll ich das machen?

Ich habe versucht, einen Raum + ein Gerät + eine Gerätefunktion (ohne Werte) in den Seed-Daten hinzuzufügen, aber das hat die anderen Tests (Raum/Gerät usw.) kaputt gemacht. Also habe ich das Gefühl, dass das nicht die richtige Methode ist.

Wenn ich den einzigen verfügbaren Raum in den Tests (Küche) nutze, schlägt der Test fehl, weil ein Wert zurückgegeben wird (normal).

Ich frage lieber, auch wenn es wirklich grundlegend ist, weil ich an einer Wand stehe.

Du kannst einfach ein Raum nur für deinen Test erstellen :slight_smile: Wenn es nur für einen einzigen Test ist, ist es besser, globale Seeds zu vermeiden.

Okay, ich habe das gemacht: wahrscheinlich ein Durcheinander, aber egal

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',
    });
  });

Ich denke, ich bin nicht weit davon entfernt

Der 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

Das Ergebnis ist da => NoValuesFoundError: No humidity values found in this room.

Aber

Wieder diese Geschichte mit dem Kontext, die ich dachte, verstanden zu haben. Wie liest man diese Ausgabe?

EDIT: Grün, was erwartet wird, und rot, was produziert/empfangen wurde?

Das ist doch nicht dreckig! Im Gegenteil, ich finde es gut, sein eigenes kleines Szenario im Test zu erstellen. :blush:

Genau, das ist es.

Okay, ich hatte Angst, verstanden zu haben :D, also verstehe ich nicht, was die Küche damit zu tun hat ^^

lol wer hätte das gedacht, Entwickler ist ein echter Beruf?? :stuck_out_tongue:

Willst du, dass wir ein Team bilden?

So weit würden wir nicht gehen :rofl:

Nicht unbedingt (du hast andere Dinge zu tun).

Was ich auf keinen Fall will, ist eine fertige Lösung ohne zu verstehen.

Nach einigen Versuchen verstehe ich immer noch nicht, warum der Code mir die Informationen eines anderen Raums zurückgibt.

Ich habe überall Logger platziert, um den Test zu testen ^^ !

Übrigens ist es wirklich seltsam, denn die rote Rückmeldung stammt vom ersten Test.

Ich hole deine Branch lokal, um zu testen, okay?

@VonOx

Ich empfehle dir, in VSCode die Möglichkeit hinzuzufügen, die Testdatei im Debug-Modus auszuführen und Breakpoints zu setzen, um den gesamten Prozess zu verfolgen.

du fügst in die Datei ein

    {
      "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"
      }
    },

Dann den kleinen grünen Pfeil, um die geöffnete Datei im Debug-Modus zu starten, mit den Breakpoints… äh, äh.

Ich habe den Test-Snippet, den ich oben gepostet habe, nicht gepusht (danke :slight_smile: )

Ja, ich habe es geholt, ich habe den Fehler.

Bevor du weitermachst, wenn du die « Fake » von Sinon verwendest,
muss du daran denken, Sinon mit

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

zurückzusetzen.

In der Funktion command, die du erstellt hast, wirfst du eine NoValuesFoundError aus, wenn dein Gerät keinen Wert hat (siehe Testfall oben).

Aber der context ist nach dem Fehler « gefüllt ».

Der Kontext ist also

    {
      room: roomFound.id,
    }

ohne alles andere drumherum.

Dein Test ist nicht schlecht, aber es gibt eine Diskrepanz zwischen dem, was du in command machst, und dem Ergebnis, das du erwartest.

Zeile 37, füge den « context » in dein Debugging ein, du wirst sehen :wink:

Alles klar, verstanden, danke Alex, ich habe die Erstellung des Geräts entfernt, das hat ja nichts gebracht :slight_smile: