我正在尝试模拟实用程序类的几个组件。虽然assert_called()
一种方法可以,但另一种方法失败,但我确信两者都被调用。我在 Windows 10 上运行 Python 3.7.3。
我已经将我的场景简化为基本要素。实用程序类 ( util.py
):
class api:
@staticmethod
def send(data):
print("sending %s" % data)
class logger:
@staticmethod
def info(s):
print("INFO: %s" % s)
@staticmethod
def error(s):
print("ERROR: %s" % s)
工作正常的单元测试变体:
import unittest
from unittest.mock import patch
from util import api
def do_something():
api.logger.info("doing something")
api.send("some data")
@patch("util.api.logger")
class Test(unittest.TestCase):
def test_do_something(self, mock_logger):
do_something()
mock_logger.info.assert_called()
失败的那个:
import unittest
from unittest.mock import patch
from util import api
def do_something():
api.logger.info("doing something")
api.send("some data")
@patch("util.api")
class Test(unittest.TestCase):
def test_do_something(self, mock_api):
do_something()
mock_api.send.assert_called()
运行测试时,我得到两个print()
输出:
INFO: doing something
sending some data
所以我确信这两种方法都被调用了。
很可能我犯了一些愚蠢的错误,因为我对python真的很陌生......
更多背景:
在我的精简场景do_something()
中,只是一组函数的替身,这些函数是我的测试对象,而在我的真实场景中,这些函数实际上是在单独的 python 文件中定义的。在生产环境中,它在提供实用程序类 api 的框架的上下文中运行。在我的测试环境中util.py
,它本身就是生产 api 的模拟。要测试的 py 文件(而不是def do_something(): ...
)加载如下:
path = os.getcwd() + "<local path to py file to be tested>"
globals().update({ **runpy.run_path(path, init_globals=globals()), **globals() })
因此,我无法修改do_something()
测试场景中的代码。