unittest mock with __new__ function lead to TypeError
Offen
Dieses Issue hat noch niemand übernommen.
stdlib
type-bug
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 35.9k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug report
Bug description:
import unittest
from unittest.mock import patch
class Summary(object):
def __init__(self, path):
print("Summary init")
def __del__(self):
print("Summary del")
def get_summary(self):
print("get_summary")
class MockSummary:
def __init__(self, path):
print("Mock start")
def __del__(self):
print("Mock end")
def get_summary(self):
print("mock_get_summary")
class TestSummary(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_summary(self):
# 1 success case
summary1 = Summary('path')
summary1.get_summary()
# 2 mock case
mock = patch.object(Summary, '__new__', return_value=MockSummary('path'))
mock.start()
summary2 = Summary('path')
summary2.get_summary()
mock.stop()
# 3 fail case
summary3 = Summary('path')
summary3.get_summary()
if __name__ == '__main__':
unittest.main()
When run this python unittest file, it turns out with error:
Summary init
get_summary
Mock start
mock_get_summary
ESummary del
======================================================================
ERROR: test_summary (__main__.TestSummary.test_summary)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/admin/workspace/python/testSummaryAll.py", line 46, in test_summary
summary3 = Summary('path')
^^^^^^^^^^^^^^^
TypeError: object.__new__() takes exactly one argument (the type to instantiate)
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
Mock end
All the instance init after the mock stop will be failed.
CPython versions tested on:
3.11
Operating systems tested on:
Linux
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit der bereitgestellten unittest-Reproduktion und untersuche das Verhalten von unittest.mock.patch.object beim Patchen von Summary.new. Reproduziere den Fehler nach mock.stop() und verfolge anschließend, wie das ursprüngliche Konstruktorverhalten wiederhergestellt wird. Fertig ist die Aufgabe, wenn nach dem Beenden des Patches Instanzen erstellt werden können und die Regression durch einen Test abgedeckt ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- testing-qa
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 38/100