gpt4 book ai didi

python - 如何模拟类的函数的返回值?

转载 作者:行者123 更新时间:2023-12-01 03:48:32 24 4
gpt4 key购买 nike

我在 Python 中有一个如下所示的方法(在 comicfile.py 中):

from zipfile import ZipFile

...

class ComicFile():
...

def page_count(self):
"""Return the number of pages in the file."""
if self.file == None:
raise ComicFile.FileNoneError()

if not os.path.isfile(self.file):
raise ComicFile.FileNotFoundError()

with ZipFile(self.file) as zip:
members = zip.namelist()
pruned = self.prune_dirs(members)
length = len(pruned)
return length

我正在尝试为此编写一个单元测试(我已经测试了prune_dirs),因此这就是我所拥有的(test_comicfile.py) :

import unittest
import unittest.mock

import comicfile

...

class TestPageCount(unittest.TestCase):

def setUp(self):
self.comic_file = comicfile.ComicFile()

@unittest.mock.patch('comicfile.ZipFile')
def test_page_count(self, mock_zip_file):
# Store as tuples to use as dictionary keys.
members_dict = {('dir/', 'dir/file1', 'dir/file2'):2,
('file1.jpg', 'file2.jpg', 'file3.jpg'):3
}

# Make the file point to something to prevent FileNoneError.
self.comic_file.file = __file__

for file_tuple, count in members_dict.items():
mock_zip_file.return_value.namelist = list(file_tuple)
self.assertEqual(count, self.comic_file.page_count())

当我运行此测试时,我得到以下结果:

F..ss....
======================================================================
FAIL: test_page_count (test_comicfile.TestPageCount)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/unittest/mock.py", line 1157, in patched
return func(*args, **keywargs)
File "/Users/chuck/Dropbox/Projects/chiv/chiv.cbstar/test_comicfile.py", line 86, in test_page_count
self.assertEqual(count, self.comic_file.page_count())
AssertionError: 2 != 0

----------------------------------------------------------------------
Ran 9 tests in 0.010s

FAILED (failures=1, skipped=2)

好的,所以 self.comic_file.page_count() 返回 0。我尝试将以下行放在 page_count 中的 members = zip.namelist() 之后。

print('\nmembers -> ' + str(members))

在测试过程中,我得到了这个:

members -> <MagicMock name='ZipFile().__enter__().namelist()' id='4483358280'>

我对单元测试还很陌生,并且对使用 unittest.mock 很模糊,但我的理解是 mock_zip-file.return_value.namelist = list(file_tuple) code> 应该这样做,以便 ZipFile 类的 namelist 方法依次返回每个 file_tuple 内容。我不知道它在做什么。

我认为我在这里想要做的事情很清楚,但我似乎无法弄清楚如何重写 namelist 方法,以便我的单元测试只测试这个函数还必须处理 ZipFile

最佳答案

ZipFile被实例化为 context manager 。至mock你必须引用它的__enter__方法。

mock_zip_file.return_value.__enter__.return_value.namelist.return_value = list(file_tuple)

您想要做的事情非常明确,但是上下文管理器增加了模拟的复杂性。

<小时/>

一个技巧是,当模拟注册对其进行的所有调用时,在本示例中,它表示它有一个调用:

members -> <MagicMock name='ZipFile().__enter__().namelist()' id='4483358280'>

这可以指导您注册模拟对象,替换所有 ()return_value

关于python - 如何模拟类的函数的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38556197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com