簡體   English   中英

Python 單元測試補丁未按預期工作

[英]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_itemtest_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被調用了。 測試當然失敗了。

我究竟做錯了什么?


嘗試 1

如果我嘗試這種其他風格的 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_itemmylib.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM