繁体   English   中英

Python:在unittest中为os.walk返回元组

[英]Python: Returning tuple for os.walk in unittest

我正在为以下功能编写单元测试:

def create_zip(path,zipf):
    #Create zip files
    for root, dirs, files in os.walk(path):
        for file in files:
            #write all json files to a zip file
            for name in glob.glob('*.json'):
                os.chdir(root)
                #write files to zip file
                zipf.write(name)
                #Remove files after creating zip file
                os.remove(name)

这是我目前所拥有的:

tmpfilepath = os.path.join(tempfile.gettempdir(), "tmp-testfile")
@mock.patch('my_script.os.walk')
def test_create_basic_zip(self,mock_os_walk):
    mock_os_walk.return_value = ('test1','test2','test3')
    zipf = zipfile.ZipFile(self.tmpfilepath, 'w', zipfile.ZIP_DEFLATED)
    files = my_script.create_zip('.',zipf)

但是我不断收到错误:

for root, dirs, files in os.walk(path):
ValueError: too many values to unpack

或当我将其更改为:

mock_os_walk.return_value = (['test1'],['test2'],['test3'])

我得到错误:

ValueError: need more than 1 value to unpack

我要去哪里错了?

为了匹配os.walk()结果格式,您需要有一个可迭代的项,其中每个项目都包含3个元素rootdirsfiles 更换:

mock_os_walk.return_value = ('test1','test2','test3')

与,例如:

mock_os_walk.return_value = [('./test1', ['test2', 'test3'], ['test4.txt']), ]

您的os.walk模拟需要返回一个可迭代的,因为您正在for ... in os.walk(...):

事实证明,元组是可迭代的。 因此,当您设置...mock.return_value = (...)您正在定义将返回的可迭代对象。

您调用os.walk ,并返回一个元组。 但是您是在for循环的上下文中调用它的,因此您已经有效地编写了:

for a,b,c in ('test1', 'test2', 'test3'):

扩展为:

a,b,c = 'test1'

第一次通过循环。

您真正想要的是提供一个迭代器,该迭代器为每个变量提供一个值,至少一次甚至更多次。 这段代码有效,我想您可以弄清楚其余的内容:

#!python3
from unittest import mock
import os


def other_function():
    for a,b,c in os.walk('.'):
        print(a,b,c)

@mock.patch('os.walk')
def test_code(mock_os_walk):
    mock_os_walk.return_value = ((1,2,3), (4,5,6), (7,8,9))
    other_function()

test_code()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM