我在测试使用mock调用方法时遇到了问题--举个简单的例子,假设这个方法是os.getcwd。我想测试一下我自己的函数pickle_wdir是否按预期调用了os.getcwd。但是,我正在测试的函数对os.getcwd返回的值进行了pickles,这会导致错误。
这里有一个简单的例子来再现这个错误。
os_ex.py
import os
import pickle
def pickle_wdir(filename):
dir = os.getcwd()
with open(filename, 'wb') as handle:
pickle.dump(dir, handle)test_os_ex.py
from unittest import TestCase
from unittest.mock import patch
from os_ex import pickle_wdir
class TestPickleWdir(TestCase):
def test_os_called(self):
fname = 'dir.pickle'
with patch('os_ex.os') as mocked_obj:
pickle_wdir(fname)
mocked_obj.getcwd.assert_called()返回的错误信息为
_pickle.PicklingError: Can't pickle <class 'unittest.mock.MagicMock'>: it's not the same object as unittest.mock.MagicMock。
如何在不获取此PicklingError的情况下测试是否调用了os.getcwd
发布于 2020-04-27 19:19:27
您需要模拟os.getcwd()、open()和pickle.dump()方法。您可以使用unittest.mock.patch作为上下文管理器来执行此操作。
例如。
os_ex.py
import os
import pickle
def pickle_wdir(filename):
dir = os.getcwd()
with open(filename, 'wb') as handle:
pickle.dump(dir, handle)test_os_ex.py
import unittest
from unittest.mock import patch, mock_open
from os_ex import pickle_wdir
class TestOsEx(unittest.TestCase):
def test_pickle_wdir(self):
fname = 'dir.pickle'
m = mock_open(read_data='mocked data')
with patch('os_ex.os') as mocked_obj, patch('builtins.open', m) as mocked_open, patch('pickle.dump') as mocked_dump:
mocked_obj.getcwd.return_value = '/root'
pickle_wdir(fname)
mocked_obj.getcwd.assert_called()
m.assert_called_with(fname, 'wb')
handle = mocked_open()
mocked_dump.assert_called_with('/root', handle)
if __name__ == '__main__':
unittest.main()100%覆盖的单元测试结果:
.
----------------------------------------------------------------------
Ran 1 test in 0.012s
OK
Name Stmts Miss Cover Missing
------------------------------------------------------------------------
src/stackoverflow/60627827/os_ex.py 6 0 100%
src/stackoverflow/60627827/test_os_ex.py 17 0 100%
------------------------------------------------------------------------
TOTAL 23 0 100%https://stackoverflow.com/questions/60627827
复制相似问题