[英]Python unittest patching is not working as expected
我有以下項目結構:
root/
|-mylib/
|-tests/
| |-__init__.py
| |-test_trend.py
|-__init__.py
|-data.py
|-trend.py
在trend.py
:
from mylib.data import get_item
def get_trend(input: str):
item = get_item(input)
return f"Trend is: {item}"
內部data.py
:
def get_item(id):
print("ORIGINAL")
return get_item_from_db(id)
我想單獨測試get_trend
,因此我在內部修補get_item
: test_trend.py
:
import unittest
from unittest.mock import patch
from mylib.trend import get_trend
def p__get_item(input):
return 0
class MyTestCase(unittest.TestCase):
@patch("mylib.data.get_item", new=p__get_item)
def test_trend(self):
v = get_trend()
self.assertEqual(v, "Trend is: 0")
但是當我運行測試時(命令是從root
目錄中運行的):
python -m unittest discover
我看到日志顯示原來的get_item
被調用了。 測試當然失敗了。
我究竟做錯了什么?
如果我嘗試這種其他風格的 APIL patch
class MyTestCase(unittest.TestCase):
@patch("mylib.data.get_item")
def test_trend(self, mocked_fun):
mocked_fun.return_value = 0
v = get_trend()
self.assertEqual(v, "Trend is: 0")
它仍然不起作用。 在控制台日志中,我可以看到正在打印ORIGINAL
並且測試失敗。
如果我將@patch
中的target
更改為不存在的屬性,例如:
@patch("mylib.data.non_existing", new=p__get_item)
我實際上從庫中收到一條錯誤消息,指出該模塊不包含此類屬性。 因此,似乎mylib.data.get_item
已被正確定位,但仍未進行修補。
get_item
在mylib.trend
模塊中調用,但是,您在mylib.data
模塊中對其進行了修補,這是錯誤的地方。 patch
通過替換import
上的對象來工作。 在這種情況下,您想要修補get_item
模塊中的mylib.trend
而不是mylib.data
。
class MyTestCase(unittest.TestCase):
@patch("mylib.trend.get_item")
def test_trend(self, mocked_get_item):
mocked_get_item.return_value = 0
...
可以在官方 python 文檔中找到有關在哪里打補丁的更多說明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.