Wo/wie werden Pytest-Parameter für einzelne Tests definiert?Python

Python-Programme
Anonymous
 Wo/wie werden Pytest-Parameter für einzelne Tests definiert?

Post by Anonymous »

Ich habe wirklich Probleme mit der automatischen Definition von Argumenten für einzelne Tests durch Pytest. Ich habe zum Beispiel diesen Test, bei dem ich einen externen API-Aufruf verspotte:

Code: Select all

def test_valid_type(monkeypatch):
mapping = {
10: True,
89: True,
120: False,
121: False,
}
monkeypatch.setattr(eligibility, "fetch_valid_types", lambda key: mapping.get(key))
assert eligibility.is_invalid(10) is False
assert eligibility.is_invalid(89) is False
assert eligibility.is_invalid(120) is True
assert eligibility.is_invalid(121) is True
Der Test funktioniert gut, aber ich bin völlig verwirrt darüber, wie/wo Monkeypatch definiert ist.
Ich versuche, dieses Monkeypatching in eine set_up-Methode zu verschieben, um das Mocking wiederverwendbar zu machen. Ich habe diese Klasse:

Code: Select all

class TestHelper():
def mock_valid(monkeypatch):
mapping = {
10: {"accessibleDeliveryLocationTypes": ["a"]},
89: {"accessibleDeliveryLocationTypes": ["b"]},
120: {"accessibleDeliveryLocationTypes": []},
121: {"accessibleDeliveryLocationTypes": []},
}
monkeypatch.setattr(routes.eligibility, "nypl_core_patron_types", lambda key: mapping.get(key))

@classmethod
def set_up(cls, monkeypatch):
cls.mock_valid(monkeypatch)
GlobalLogger.initialize_logger(__name__)
Es kommt mir seltsam vor, dass ich Monkeypatch wie ein tatsächliches Argument in dieser set_up-Methode übergeben müsste, wenn der obige Test ausgeführt wird, kann der Wert automatisch ausgefüllt werden. Ich habe auch versucht, in der Methode „mock_valid“ einen Standardwert mit einer Funktionssignatur wie dieser zuzuweisen: def mock_nypl_core(cls, Monkeypatch=monkeypatch): . Dies führt dazu, dass der Name „monkeypatch“ nicht definiert ist. Ich denke, wenn „monkeypatch“ als Argument ohne lokale Definition funktionieren kann, sollte ich es dann nicht auch als Standardwert für diesen Parameter angeben können?
Ich weiß, dass dies kein reproduzierbares Beispiel ist. Ich bin weniger daran interessiert, dass dies funktioniert, als vielmehr daran, mehr über Namespaces und die automatischen Definitionen von Pytest herauszufinden.
Kann jemand den Prozess erklären, den Pytest zur Laufzeit durchläuft, um Testfunktionsparameter zu füllen? Es fühlt sich an wie eine Verschmelzung meines Verständnisses von Parametern (die Variablennamen, die den Werten zugewiesen werden, von denen erwartet wird, dass sie an eine Funktion übergeben werden) und Argumenten (die tatsächlich ausgefüllten Werte, die an einen Aufruf dieser Funktion übergeben werden). Gibt es irgendwo eine dokumentierte Liste dieser eingebauten Geräte, die nicht importiert werden müssen, und der vordefinierten Parameter? Schließlich stelle ich mir vor, dass sie irgendwann tatsächlich in die Funktion eingefügt werden müssen. Wo passiert das? Befinden sie sich nur im globalen Maßstab? oder übergibt Pytest sie tatsächlich irgendwann?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post