From 684d7fc15c9346cd3d148d2879c6bb78d58508a2 Mon Sep 17 00:00:00 2001 From: Thomas Hassenstein <2021544@stud.hs-mannheim.de> Date: Wed, 10 Jan 2024 10:25:53 +0100 Subject: [PATCH] Dateien nach "test" hochladen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tests überarbeiten und auskommentieren dort wo Firebase Mocking gebraucht wird (nicht hinbekommen wie das funktioniert) --- test/navigation_test.dart | 167 ++++++++++++++++++++++++++++++++------ test/unit_test.dart | 36 ++++---- test/widget_test.dart | 108 +++++++++++++++++++----- 3 files changed, 244 insertions(+), 67 deletions(-) diff --git a/test/navigation_test.dart b/test/navigation_test.dart index cfe795e..f887516 100644 --- a/test/navigation_test.dart +++ b/test/navigation_test.dart @@ -1,25 +1,142 @@ -// import 'package:flutter/material.dart'; -// import 'package:flutter_test/flutter_test.dart'; -// import 'package:kochkomplize/main.dart'; -// import 'package:kochkomplize/menu.dart'; -// -// Widget buildMenu() { -// return MaterialApp( -// home: Scaffold( -// body: Menu(onMenuItemSelected: (menuItem) {}), -// ), -// ); -// } -// -// void main() { -// testWidgets('Check menu text', (WidgetTester tester) async { -// await tester.pumpWidget(buildMenu()); -// expect(find.text('Meine Rezepte'), findsOneWidget); -// }); -// -// testWidgets('Check number of list items', (WidgetTester tester) async { -// await tester.pumpWidget(const MyApp()); -// expect(find.byType(GestureDetector), findsNWidgets(2)); -// }); -// -// } +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:kochkomplize/recipedetailpage.dart'; +import 'package:kochkomplize/recipeformpage.dart'; +import 'package:kochkomplize/recipesoverview.dart'; + +void main() { + + testWidgets('Recipeformpage has form fields', (WidgetTester tester) async { + await tester.pumpWidget(MaterialApp(home: Recipeformpage())); + + // Prüfen Sie, ob die Formularfelder vorhanden sind + expect(find.byType(TextFormField), findsWidgets); + // Prüfen Sie den Speichern-Button + expect(find.byType(FloatingActionButton), findsOneWidget); + }); + + //todo: Firebase Mocking + + // testWidgets('RecipeDetailPage UI Test', (WidgetTester tester) async { + // await tester.pumpWidget(const MaterialApp( + // home: RecipeDetailPage( + // recipeId: 'testId', + // recipe: {'titel': 'Testrezept', 'beschreibung1': 'Beschreibung',}, + // ), + // )); + // + // // Überprüfen Sie, ob die Texte vorhanden sind + // expect(find.text('Testrezept'), findsOneWidget); + // expect(find.text('Beschreibung'), findsOneWidget); + // // Weitere UI-Elemente überprüfen + // }); + + // testWidgets('RecipeDetailPage displays static data', (WidgetTester tester) async { + // // Erstellen Sie Mock-Daten für das Rezept + // final Map mockRecipeData = { + // 'titel': 'Testrezept', + // 'beschreibung1': 'Beschreibung1', + // }; + // + // await tester.pumpWidget(MaterialApp( + // home: RecipeDetailPage(recipeId: '123', recipe: mockRecipeData), + // )); + // + // // Überprüfen Sie, ob alle UI-Elemente vorhanden sind + // expect(find.text('Testrezept'), findsOneWidget); + // expect(find.text('Beschreibung1'), findsOneWidget); + // }); + + + + + // testWidgets('Recipeformpage form fields and submit', (WidgetTester tester) async { + // await tester.pumpWidget(const MaterialApp(home: Recipeformpage())); + // + // // Eingabe im Titelfeld simulieren + // await tester.enterText(find.byType(TextFormField).at(0), 'Testrezept'); + // + // // 'Speichern'-Button drücken + // await tester.tap(find.byType(FloatingActionButton)); + // await tester.pump(); + // }); + + // Test für das Rendering der Rezeptdetails + // testWidgets('RecipeDetailPage renders recipe details', (WidgetTester tester) async { + // // Erstellen Sie Mock-Daten für das Rezept + // final Map recipeData = { + // 'titel': 'Testrezept', + // 'beschreibung1': 'Beschreibung1', + // 'beschreibung2': 'Beschreibung2', + // }; + // + // await tester.pumpWidget(MaterialApp( + // home: RecipeDetailPage(recipeId: '123', recipe: recipeData), + // )); + // + // // Überprüfen, ob alle UI-Elemente vorhanden sind + // expect(find.text('Testrezept'), findsOneWidget); + // expect(find.text('Beschreibung1'), findsOneWidget); + // expect(find.text('Beschreibung2'), findsOneWidget); + // }); + + // Test für die Löschfunktion + // testWidgets('RecipeDetailPage delete recipe', (WidgetTester tester) async { + // await tester.pumpWidget(const MaterialApp( + // home: RecipeDetailPage(recipeId: '123', recipe: {/* Mock-Daten */}), + // )); + // + // // Löschen-Button antippen und Dialog-Interaktion simulieren + // await tester.tap(find.byIcon(Icons.delete)); + // await tester.pump(); // Lädt den AlertDialog + // await tester.tap(find.text('Löschen')); + // await tester.pump(); // Simuliert das Drücken des Löschen-Buttons + // }); + + // testWidgets('RecipesOverview list and navigation', (WidgetTester tester) async { + // // Mocking der Firebase-Daten erforderlich + // + // await tester.pumpWidget(MaterialApp(home: RecipesOverview())); + // + // // Überprüfen, ob die Rezeptliste geladen wird + // expect(find.byType(ListView), findsOneWidget); + // + // // Simulieren des Antippens eines Rezepts + // tester.tap(find.byType(GestureDetector).first); + // await tester.pumpAndSettle(); + // + // // Überprüfen, ob die Navigation zum Detailbildschirm funktioniert + // expect(find.byType(RecipeDetailPage), findsOneWidget); + // }); + + + //Todo: Mocking für die Datenbank + // Initialisieren Sie Firebase vor dem Ausführen der Tests + // setUpAll(() async { + // await Firebase.initializeApp( + // options: DefaultFirebaseOptions.currentPlatform, + // ); + // }); + // testWidgets('Navigating from MyHomePage to Recipeformpage', (WidgetTester tester) async { + // // Starten Sie die App + // await tester.pumpWidget(const MyApp()); + // + // // Öffnen Sie das Menü, um die Navigation zu `RecipesOverview` zu simulieren + // await tester.tap(find.byIcon(Icons.menu)); + // await tester.pumpAndSettle(); // Warten, bis die Animation abgeschlossen ist + // + // // Tippen Sie auf das Menüelement 'Meine Rezepte' + // await tester.tap(find.text('Meine Rezepte')); + // await tester.pumpAndSettle(); // Warten, bis die neue Seite geladen ist + // + // // Überprüfen Sie, ob `RecipesOverview` angezeigt wird + // expect(find.byType(RecipesOverview), findsOneWidget); + // + // // Tippen Sie auf den FloatingActionButton, um `Recipeformpage` zu öffnen + // await tester.tap(find.byIcon(Icons.add)); + // await tester.pumpAndSettle(); // Warten, bis die neue Seite geladen ist + // + // // Überprüfen Sie, ob die `Recipeformpage` angezeigt wird + // expect(find.byType(Recipeformpage), findsOneWidget); + // }); +} \ No newline at end of file diff --git a/test/unit_test.dart b/test/unit_test.dart index d9306c8..06f93c8 100644 --- a/test/unit_test.dart +++ b/test/unit_test.dart @@ -1,22 +1,14 @@ -// import 'package:flutter_test/flutter_test.dart'; -// import 'package:firebase_core/firebase_core.dart'; -// import 'package:kochkomplize/main.dart'; -// import 'package:kochkomplize/recipesoverview.dart'; -// import 'package:kochkomplize/startpage.dart'; -// -// void main() { -// test('_MyHomePageState should update selected menu content', () { -// final state = _MyHomePageState(); -// -// state._onMenuItemSelected('Meine Rezepte'); -// expect(state._selectedMenuContent, isInstanceOf()); -// -// state._onMenuItemSelected('Startseite'); -// expect(state._selectedMenuContent, isInstanceOf()); -// }); -// -// test('Firebase initializes correctly', () async { -// await main(); // Ihr main-Methodenaufruf -// expect(Firebase.apps.length, isNonZero); -// }); -// } \ No newline at end of file +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:kochkomplize/main.dart'; + +void main() { + testWidgets('MyHomePage renders correctly', (WidgetTester tester) async { + await tester.pumpWidget(const MaterialApp(home: MyHomePage(title: 'Kochkomplize'))); + + // Überprüfen Sie, ob der Titel korrekt angezeigt wird + expect(find.text('Kochkomplize'), findsOneWidget); + + + }); +} \ No newline at end of file diff --git a/test/widget_test.dart b/test/widget_test.dart index 4fcf084..41d847b 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,21 +1,89 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:kochkomplize/main.dart'; -import 'package:kochkomplize/recipesoverview.dart'; - -void main() { - testWidgets('Menu navigation test', (WidgetTester tester) async { - await tester.pumpWidget(const MyApp()); - - // Öffne das Menü - await tester.tap(find.byIcon(Icons.menu)); - await tester.pumpAndSettle(); - - // Wähle einen Menüpunkt - await tester.tap(find.text('Meine Rezepte')); - await tester.pumpAndSettle(); - - // Überprüfe, ob das richtige Widget angezeigt wird - expect(find.byType(RecipesOverview), findsOneWidget); - }); +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:kochkomplize/menu.dart'; + +void main() { + + testWidgets('Menu renders correctly', (WidgetTester tester) async { + void onMenuItemSelectedMock(String item) {} + + // Verwenden Sie einen GlobalKey, um auf den Scaffold zuzugreifen + GlobalKey scaffoldKey = GlobalKey(); + + await tester.pumpWidget(MaterialApp(home: Scaffold(key: scaffoldKey, drawer: Menu(onMenuItemSelected: onMenuItemSelectedMock)))); + + // Öffnen Sie den Drawer programmatisch + scaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); // Warten, bis die Animation abgeschlossen ist + + // Überprüfen Sie nun, ob die Elemente im Drawer vorhanden sind + expect(find.byType(Drawer), findsOneWidget); + expect(find.text('Hauptmenü'), findsOneWidget); + expect(find.text('Startseite'), findsOneWidget); + expect(find.text('Meine Rezepte'), findsOneWidget); + }); + + testWidgets('Tapping each menu item calls onMenuItemSelected with correct item', (WidgetTester tester) async { + String selectedMenuItem = ''; + + void onMenuItemSelectedMock(String item) { + selectedMenuItem = item; + } + + GlobalKey scaffoldKey = GlobalKey(); + + await tester.pumpWidget(MaterialApp(home: Scaffold(key: scaffoldKey, drawer: Menu(onMenuItemSelected: onMenuItemSelectedMock)))); + + scaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); // Warten, bis die Animation abgeschlossen ist + + // Tippen Sie auf das Menüelement 'Startseite' und überprüfen Sie die Funktionalität + await tester.tap(find.text('Startseite')); + await tester.pumpAndSettle(); + expect(selectedMenuItem, 'Startseite'); + + // Wiederholen Sie den Vorgang für 'Meine Rezepte' + scaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + await tester.tap(find.text('Meine Rezepte')); + await tester.pumpAndSettle(); + expect(selectedMenuItem, 'Meine Rezepte'); + + // Hier können Sie weitere Tests für andere Menüpunkte hinzufügen + }); + + testWidgets('Drawer closes after an item is selected', (WidgetTester tester) async { + void onMenuItemSelectedMock(String item) {} + + GlobalKey scaffoldKey = GlobalKey(); + + await tester.pumpWidget(MaterialApp(home: Scaffold(key: scaffoldKey, drawer: Menu(onMenuItemSelected: onMenuItemSelectedMock)))); + + scaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Startseite')); + await tester.pumpAndSettle(); + + // Überprüfen Sie, ob der Drawer geschlossen ist + expect(scaffoldKey.currentState!.isDrawerOpen, isFalse); + }); + + testWidgets('Drawer header renders correctly', (WidgetTester tester) async { + // Erstellen Sie eine Mock-Funktion, die einen String als Parameter erwartet + void onMenuItemSelectedMock(String item) {} + + GlobalKey scaffoldKey = GlobalKey(); + + await tester.pumpWidget(MaterialApp( + home: Scaffold(key: scaffoldKey, drawer: Menu(onMenuItemSelected: onMenuItemSelectedMock)) + )); + + scaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + + // Überprüfen Sie, ob der DrawerHeader vorhanden ist + expect(find.byType(DrawerHeader), findsOneWidget); + expect(find.text('Hauptmenü'), findsOneWidget); + }); } \ No newline at end of file