Wie verspottet man eine schreibgeschützte Eigenschaft mit mock ?
Ich habe es versucht:
setattr(obj.__class__, 'property_to_be_mocked', mock.Mock())
aber das Problem ist, dass es dann für alle Instanzen der Klasse gilt ... was meine Tests bricht.
Hast du eine andere Idee? Ich möchte nicht das gesamte Objekt verspotten, sondern nur diese bestimmte Eigenschaft.
python
unit-testing
mocking
pytest
charlax
quelle
quelle
@property
. Diese Antwort hat bei mir funktioniert, wenn die andere Antwort (und andere Antworten auf viele andere Fragen) nicht funktioniert hat.Eigentlich war die Antwort (wie üblich) in der Dokumentation , es ist nur so, dass ich den Patch auf die Instanz anstatt auf die Klasse angewendet habe, als ich ihrem Beispiel gefolgt bin.
So geht's:
In der Testsuite:
quelle
mock.PropertyMock
ist der Weg es zu tun!PropertyMock
gab es noch keine.Wenn das Objekt, dessen Eigenschaft Sie überschreiben möchten, ein Scheinobjekt ist, müssen Sie es nicht verwenden
patch
.Kann stattdessen eine erstellen
PropertyMock
und dann die Eigenschaft für den Typ des Mocks überschreiben . So überschreiben Sie beispielsweise die zurückzugebendemock_rows.pages
Eigenschaft(mock_page, mock_page,)
:quelle
Wahrscheinlich eine Frage des Stils, aber falls Sie Dekorateure in Tests bevorzugen, könnte die Antwort von @ jamescastlefield wie folgt geändert werden:
quelle
Wenn Sie
pytest
zusammen mit verwendenpytest-mock
, können Sie Ihren Code vereinfachen und die Verwendung des Kontextmanagers, dh der folgendenwith
Anweisung, vermeiden :quelle
Wenn Sie nicht testen möchten, ob auf die verspottete Eigenschaft zugegriffen wurde, können Sie sie einfach mit der erwarteten Eigenschaft patchen
return_value
.quelle