如何为访问从csv文件创建的全局字典的函数编写单元测试



我有一个process_persons()Python函数,它访问全局字典,如下所示:

def process_persons():
    for k, v in person_dict.items():
        # do some processing
def main():
    global person_dict        
    person_dict = {}
    reader = csv.reader(open('person_file.csv', 'r'))
    for row in reader:
        key = (row[0], row[1])
        person_dict[key] = row[2]

我写了一个这样的单元测试:

def test_process_persons(self):
    process_persons()
    # assert that the processing is done right!

但我得到了错误:名称错误:全局名称"person_dict"未定义。感谢您的帮助。

请注意,我不能更改我正在测试的方法的签名!

NameError: global name 'person_dict' is not defined

那是因为你没有定义它。它怎么知道它是什么?你说person_dict[key] = row[2],但这并不能自动使它成为词典。你必须用一个值来初始化它,例如

person_dict = {}

上面写着这是一本空字典。

也不需要global声明。您将作为文件的顶层执行此操作(即不在函数或类内部),以便可以正常使用它。

我相信它实际上是未定义的。请尝试将global person_dict替换为:

person_dict = {}

不太确定你想要实现什么,但考虑到被测函数的签名被冻结,我可能会这样做。

def process_persons():
    for k, v in person_dict.items():
        # do some processing
person_dict = {}
if __name__ == '__main__':
    reader = csv.reader(open('person_file.csv', 'r'))
    for row in reader:
        key = (row[0], row[1])
        person_dict[key] = row[2]

你需要在某个地方定义person_dict。声明它是全局的并不能定义它。当您想从函数中为模块级定义的变量赋值时,会使用global。如果未指定global,则会在函数中创建一个新的局部变量,该变量将覆盖全局变量。然后,当函数退出时,新创建的变量将超出范围,被垃圾收集,并被遗忘,没有任何用处。

既然您已经在模块级别上定义了person_dict,那么在调用process_persons来更改输入数据之前,您可以简单地从测试代码中将其分配给它。

相关内容

  • 没有找到相关文章

最新更新