Unittests für Methoden einer Klasse

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
__deets__
User
Beiträge: 14527
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du mal ein Beispiel, wo die QApplication als erstes Argument and QMainWindow uebergeben wird? Das moechte ich sehen. Ob Leute von QMainWindow ABLEITEN, und sich dann eigene Konstruktoren bauen, an die man Hund, Katze, Maus uebergeben kann - ja gut. Aber das ist ja nicht was du gemacht hast.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__: Hier ist so ein Beispiel. Gerade nochmal getestet und das Beispiel tut was es soll.

PyCharm zeigt bei der Übergabe von 'QApplication' an ein 'QMainWindow' immerhin folgende Warnung an:
PyCharm hat geschrieben:Expected type 'Optional[QWidget]', got 'QApplication' instead
Inspection info: This inspection detects type errors in function call expressions. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Types of function parameters can be specified in docstrings or in Python 3 function annotations.
Gruß
Atalanttore
__deets__
User
Beiträge: 14527
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und wenn du mal genau schaust was das MainWindow (eine eigene Klasse) mit dem übergebenen Argument macht? Wird das an den konstruktor von QMainWindow übergeben?
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__: Der Konstruktor des `MainWindow` macht mit dem übergebenen Argument offensichtlich nichts. Das Programm funktioniert auch immer noch, wenn ich einen sinnlosen Textstring anstatt einem `QApplication` als Argument übergebe.

Mit zwei übergebenen Argumenten kommt es allerdings zu folgendem Fehler.

Code: Alles auswählen

main_window = MainWindow(app, sinnloser_text)
TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given
Der TypeError scheint ein zusätzliches Argument zu kennen. Nach meinem Verständnis müsste die Fehlermeldung lauten, dass `__init__()` 0 bis 1 positionale Argumente übernimmt, aber 2 übergeben wurden.

Gruß
Atalanttore
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Atalanttore: Du vergisst das implizit übergebene `self`. Damit sind das drei Argumente.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__blackjack__: Stimmt. Da war doch was ...

Auf welches Objekt verweist eigentlich das implizit übergebene `self` bei der Instanziierung der Klasse `MainWindow`?

Gruß
Atalanttore
__deets__
User
Beiträge: 14527
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na auf die MainWindow Instanz. Auf sich selbst. Eben “self”.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Wie sinnvoll sind eigentlich `assert`-Anweisungen in Funktionen/Methoden, um sinnlose Argumente abzufangen?

Beispiel:

Code: Alles auswählen

def calculate_bmi(size, weight):
    assert size > 0, "Size is zero or negative."
    assert weight > 0, "Weight is zero or negative."
    return weight / (size / 100) ** 2
Gruß
Atalanttore
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

`assert` wird benutzt, um Programmierfehler aufzudecken, nicht um Benutzereingaben zu validieren. Hier würde ich einen ValueError werfen.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

In der .ui-Datei (Qt) ist der Eingabebereich so definiert, dass keine sinnlosen Werte entstehen und als Argumente übergeben werden.

Gruß
Atalanttore
Antworten