Ah, aber du hast also von der eigentlichen Erkennung gesprochen? So etwas wie „wenn der Arduino einen bestimmten 433er-Code empfängt, dann wurde die Tür geöffnet“?
Denn das habe ich noch nicht codiert, aber die Features sind vorhanden und bereit zum Codieren
Also, meiner Meinung nach ist alles gut für eine erste Version. Das Größte, was jetzt noch zu tun bleibt, sind die Tests! Nur ein kleiner Wermutstropfen… Ich habe Schwierigkeiten, die Funktionsweise der Tests zu verstehen
Könnte eine gute Seele mir bitte helfen, diese Tests richtig zu schreiben?
Ja! Das ist nicht codiert? Es wäre vielleicht gut, wenn es vor einer Veröffentlichung funktioniert, sonst ist es wenig nützlich, es zu deployen
Das Ziel der Tests ist es, den von dir geschriebenen Code auszuführen und das Ergebnis deines Codes zu testen.
Die Tests werden von CircleCI bei jedem Push auf das Gladys-Repo ausgeführt und ermöglichen es, zu überprüfen, dass der neue Code den alten Code nicht „kaputt“ macht.
Zum Beispiel, wenn du eine Funktion schreibst
// lib/sum.js
function sum(a, b) {
return a + b;
}
Möchtest du vielleicht einen Test schreiben, der überprüft, dass sum(1, 2) = 3 ist.
Wenn wir diesen Codeausschnitt ausführen, indem wir „mocha“ (das Test-Tool, das wir verwenden) starten, werden wir sehen:
should return 3
Stell dir jetzt vor, dass in naher Zukunft jemand unsere Funktion sum(a, b) kaputt macht und versehentlich das + durch ein * ersetzt.
Bei der Ausführung der Tests würde der Test „should return 3“ 2 zurückgeben, und mocha würde schreien:
should return 3
Expected « 2 » to equal « 3 »
So würden wir wissen, dass dieser PR etwas kaputt macht.
Dieses Beispiel ist simplistisch, aber in der Realität ist es sehr nützlich. Denn du arbeitest jetzt am Arduino, aber was sagt mir das, dass du die Z-Wave-Integration nicht kaputt gemacht hast, während du die Arduino-Integration entwickelt hast? Die Tests
Das Mocking
Aber jetzt wirst du mir sagen: Ja, aber mein Code ruft über USB einen Arduino auf, wie mache ich das in meinen Tests?
Bei den Tests wollen wir nicht mit der Außenwelt kommunizieren: Es ist sinnlos, das Verhalten der Lib serialport zu testen, die selbst bereits Tests hat!
Nein, die Bewegungs- und Türsensoren sind noch nicht codiert… Das mache ich heute, das scheint mir relativ einfach umzusetzen ^^
Danke für die Erklärungen, ich glaube, das Problem liegt vor allem beim Mocking. Ich werde versuchen, ein erstes Testskript zu beenden und, wenn du möchtest, poste ich hier den Link, damit du mir sagen kannst, ob meine Vorgehensweise korrekt ist
Eine erste Version für die Sensoren ist fertig, vielleicht muss man sie später noch verfeinern, aber im Moment scheint mir das Ergebnis gut
Was die Tests angeht, hier sind die Dateien:
@pierre-gilles, wenn du etwas Zeit hast, um die Codes zu überprüfen und mir zu sagen, was noch hinzugefügt/geändert werden sollte, wäre das wirklich super
Vielen Dank
Edit: Ich arbeite gerade an der demo.json, damit der Service auf der Demo-Website erscheinen kann. Ich denke, dass es bis Mittag fertig sein könnte ^^
Re-edit: Normalerweise ist alles gut.
Anscheinend habe ich nicht die Berechtigung, eine Überprüfung anzufordern, also poste ich die PR hier:
Nach viel Mühe komme ich endlich mit den Tests voran
Ich möchte die lib avrgirl-arduino mocken, um mein Skript setup.js zu überprüfen.
Hier ist, was ich gemacht habe:
Und in setup.test.js habe ich proxyquire verwendet:
Allerdings habe ich das Gefühl, dass meine Tests meinen Mock nicht berücksichtigen:
setup-Methode
2020-06-04T14:16:20+0200 <info> index.js:18 (Server.<anonymous>) Server läuft auf Port 6500
✓ Sollte einen Arduino-Code auf dem Board hochladen (110ms)
2020-06-04T14:16:20+0200 <warn> setup.js:7 () Fehler: Kein Arduino 'mega' gefunden.
at /home/Alexandre/Gladys/server/services/arduino/node_modules/avrgirl-arduino/lib/connection.js:30:25
at /home/Alexandre/Gladys/server/services/arduino/node_modules/avrgirl-arduino/lib/connection.js:70:12
at /home/Alexandre/Gladys/server/services/arduino/node_modules/avrgirl-arduino/lib/connection.js:191:26
at processTicksAndRejections (internal/process/task_queues.js:93:5)
✓ Sollte einen Fehler zurückgeben (451ms)
Danach, um meine Sende- und Empfangsskripte abdecken zu können, muss ich den Teil
if (!this.arduinosPorts[arduinoPath].isOpen) {
this.arduinoParsers[arduinoPath].on('data', async (data) => {
meiner Datei abdecken. Die Logik ist dieselbe für listen und senden.
Aber hier tue ich mich etwas schwer zu sehen, wie ich das abdecken soll…
Mir scheint, dass proxyquire nur auf die Datei funktioniert, die es erfordert. Allerdings sehe ich in deiner Datei /server/services/arduino/lib/index.js kein require für avrgirl-arduino.
Tatsächlich wird avrgirl-arduino nur im Skript /server/services/arduino/lib/setup.js verwendet, daher habe ich kein require in /server/services/arduino/lib/index.js gemacht. Aber ich sehe nicht, wie ich das lösen soll, da setup eine Methode meines ArduinoManagers ist.
Muss ich setup.js separat vom ArduinoManager testen? Serialport und avrgirl-arduino als Eigenschaft des Managers einbinden und sie dann in meinen Skripten verwenden?
Beide Lösungen sind möglich Du entscheidest, welche Lösung dir am einfachsten umzusetzen und in Zukunft zu warten erscheint
Früher haben wir normalerweise alle require-Anweisungen in die index.js des Moduls gestellt und sie als Abhängigkeit in den Manager injiziert. Beispiel: service z-wave
Stimmt, diese Vorgehensweise erscheint mir viel einfacher ^^ Ich habe meine Skripte entsprechend angepasst, und alles scheint zu funktionieren
Jetzt scheint es, als ob meine Codeabdeckung seltsamerweise in der Zwischenzeit abgenommen hat ^^ Ich arbeite daran und gebe dir Bescheid, wenn alles korrekt erscheint
Also, hier ist es: Laut dem letzten Codecov-Bericht scheinen meine Tests endlich abgeschlossen zu sein ^^
@pierre-gilles Falls du etwas Fehlendes siehst, warte ich auf dein Feedback, ansonsten ist für mich alles gut für eine erste Version
Ich wollte auch Danke sagen! Da es mein erstes „echtes“ Dev in Node und Preact war, war ich zugegeben an manchen Stellen etwas verloren. Also danke für eure Geduld, und ich freue mich darauf, das Ergebnis mehrerer Dev-Abende als integralen Bestandteil von Gladys 4 zu sehen
Kann der Feature-Typ von der Funktion abhängig sein? Ich finde es ein bisschen dumm, eine Feature auszuwählen, wenn die Funktion sie bereits definiert (Light für eine Temperaturfunktion )
Ich melde mich nach einer langen Abwesenheit meinerseits wegen der Arbeit wieder ^^’
Ich nehme also die Entwicklung des Arduino-Dienstes wieder auf, mit dem Ziel, ein stabiles und perfektes Ergebnis für den Produktionsstart zu haben
Ich habe meinen lokalen Repository rebase, um mit den neuesten Versionen auf dem neuesten Stand zu sein, ich werde also weiter daran arbeiten und ich werde Rückmeldungen zu meinem Fortschritt geben