python / python/cpython

unittest mock with __new__ function lead to TypeError

未關閉
#123,723 3 則留言 2 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

stdlib type-bug
主要語言
Python
星號
77.2k
分支
35.9k
PR 合併指標
PR 指標待擷取

描述

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

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

研究方向

從提供的 unittest 重現開始,檢查對 Summary.new 進行 patch 時 unittest.mock.patch.object 的行為。在 mock.stop() 後重現該失敗,然後追蹤原始建構函式行為是如何恢復的。完成的標準是停止 patch 後可以建立實例,並且該回歸由測試涵蓋。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
python
領域
testing-qa
Issue 類型
缺陷
難度
4/5
預估耗時
3-5 天
活躍度
停滯
描述清晰度
基本清楚
新手友好度
38/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。