Laden...

Net Maui und MSTest

Letzter Beitrag vor einem Jahr 8 Posts 1.024 Views
Net Maui und MSTest

Hallo zusammen.

Ich würde gerne für meine Net Maui App Unit Tests schreiben, aber ich bekomme das Test- Projekt nicht referenziert. Alle Versuche schlagen fehl. Ich habe bereits versucht was hier steht:

Unit testing business logic in maui project · dotnet/maui · Discussion #5828 · GitHub

und was hier steht:

.NET MAUI – Forget Me Not – 7 – Unit Testing | Jesse Liberty

Allerdings zerschießt mir alles, das Projekt.

Ich nutze Net Maui mit NET 7.0.

Über Hilfe wäre ich sehr dankbar!

aber ich bekomme das Test- Projekt nicht referenziert

Du willst das UnitTest-Projekt im MAUI-Projekt referenzieren, oder umgekehrt?
Ersteres wäre Quatsch 😉

Allerdings zerschießt mir alles, das Projekt.

Das ist keine Fehlermeldung.

Generell testest Du aber nicht MAUI, sondern deinen Code.
Wenn Du das nicht trennen kannst, dann hast Du beim Aufbau deines Projektes was falsch gemacht 😉
MAUI kann ja durchgehend Dependency Injection, Du kannst also alle deine Business Logik in Services auslagern und wie in jedem anderen Projekt auch unittesten - vorausgesetzt, sie sind korrekt unabhängig.

By the way: Ich würde xUnit nehmen, das ist mMn. besser als MSTest.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

Hallo, danke für deine Antwort!

Ich habe gerade den Fehler gefunden! Der Dateipfad hat Probleme gemacht! Er war zu lang! ich habe das Projekt verschoben und die Frameworks angeglichen wie in den Anleitungen. Jetzt konnte ich dem MSTest- Projekt einen Verweis auf das Net Maui- Projekt hinzufügen. Nun gibt es aber eine neue Frage ⇒ Ich habe platformspezifischen C#- Code für Windows Implementiert (Serial Port). Kann ich das Unit- testen, oder bleibt mir das verwehrt?

Unit-Tests sind Tests, die sich ohne externe Abhängigkeiten durchführen lassen. Willst Du einen Unit-Test umsetzen, der Daten von einem Serial Port bekommt, dann mockt man das in einem Unit-Test. Der übliche Pattern wäre hierfür ein Facade-Pattern.

Ein Test mit einem "echten" Serial-Port wäre ein Integrationstest; und natürlich geht das dann auch nur mit Abhängigkeit zur Plattform.

Das Mocken ist mir soweit bekannt. Ich habe im gemeinsamen Code dafür ein Interface erstellt für die Klasse. Dann habe ich eine Klasse die mir die Funktionalität für den SerialPort bereit stellt (SerialPortMock). Den mock ⇒var Com = New Mock<SerialPortMock>() ( dort stelle ich die Daten bereit die Theoretisch vom port kommen) nun möchte ich meine Klasse testen ⇒ var sut = new MySerialPortClass(com);. Aber ich kann irgnwie nicht auf den Platformordner im Maui Projekt zugreigen, um die erstellte Klasse zu instanziieren.

Ich kann auf die Klasse die ich im Namespace "MeineApp.Platforms.Windows.Com" implementiert habe nicht zugreifen, um es zu Testen. Visual studio stellt mir zwar den Ordner "Platforms" im test- Projekt zur verfügung, aber wenn ich ihn nutzen möchte wird behauptet, dass der Namespace nicht existiert.

Wir alle sehen Dein Code nicht. Aber es riecht sehr fischig danach, dass

  • Deine Software Architektur (also das Zusammenspiel Deiner Projekte) nicht stimmt
  • oder dass Dein Namespace-Design nicht stimmt
  • oder Du einfach was vergessen hast.

aber wenn ich ihn nutzen möchte wird behauptet, dass der Namespace nicht existiert.

Visual Studio ist nur eine IDE. Der Fehler kommt vom Compiler - hier Roslyn - und der hat immer recht.

Aber ich kann irgnwie nicht auf den Platformordner im Maui Projekt zugreigen, um die erstellte Klasse zu instanziieren.

Riecht auch nach einem Fehler in der Architektur. Dein UI Projekt - hier MAUI - sollte nur UI-Relevante Dinge beinhalten.

Liegen in diesem Projekt Bestandteile, die zu Deinem Daten-Access, irgendwelcher Logik oder externer Schnittstellen - wozu auch SerialPort gehört - beinhalten, dann ist das sehr unpraktisch; klassischer Fehler der Projektorganisation.
Denn das macht sehr vieles sehr viel komplexer - zB das Testen.

Sowas legt man in eigene Projekte und eigene Namespaces, die dann auch einfacher mit Unit- oder Integrationstest beballert werden können.
Im Endeffekt ist es üblich, dass jedes Projekt ein paralleles Test-Projekt hat. Das ist zwar in .NET umständlicher als zB in Angular - aber aufgrund der Runtime so organisatorisch notwendig.

Zum glück ist noch nicht viel kaputt. Das ist die erste Klasse die ich implementiert habe. Vom Aufbau war eben mein gedanke, dass Maui das Gesamtprojekt darstellt incl. Dem geteilten Code. Da der Zugriff auf den Serial Port von den verschiedenen Plattformen unterschiedlich ist, wollte ich das für die Plattformen spezifisch implementieren und den Zugriff dann im gemeinsamen Teil regeln. D.h. Maui stellt die reine UI und für meinen Serial Port z.B. erstelle ich ein separates Projekt und stelle einen verweis darauf her?