首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用模拟检查函数时调用PicklingError

使用模拟检查函数时调用PicklingError
EN

Stack Overflow用户
提问于 2020-03-11 08:49:14
回答 1查看 2.1K关注 0票数 3

我在测试使用mock调用方法时遇到了问题--举个简单的例子,假设这个方法是os.getcwd。我想测试一下我自己的函数pickle_wdir是否按预期调用了os.getcwd。但是,我正在测试的函数对os.getcwd返回的值进行了pickles,这会导致错误。

这里有一个简单的例子来再现这个错误。

os_ex.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2020-04-27 19:19:27

您需要模拟os.getcwd()open()pickle.dump()方法。您可以使用unittest.mock.patch作为上下文管理器来执行此操作。

例如。

os_ex.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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%覆盖的单元测试结果:

代码语言:javascript
复制
.
----------------------------------------------------------------------
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%
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60627827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档