如何对包含 assert __name__ == "__main__" 的文件进行单元测试

How to unittest file containing assert __name__ == "__main__"

我想使用 Mock 测试库对模块中的一段代码进行单元测试。

# File_name: do.py

assert __name__ == "__main__", "This module should NOT be imported."

from disk import Disk

def bool_fun(args):
    res = Disk.disks()
    print(res)
    if args not in res:
        return -1
    return args

以上文件包含 assert name == "__main__" 阻止模块在测试中导入文件。

# File_name: do_test.py

import unittest
from unittest import mock

import do

class DOTest(unittest.TestCase):

    @mock.patch('do.Disk.disks')
    def test_bool_fun(self, mock_disks):
        args = 4
        mock_disks.return_value = [4,3,2,3,4]
        res = do.bool_fun(args)
        self.assertEqual(res, args)

if __name__ == "__main__":
    unittest.main()

do.py文件中导入了一个辅助文件,

# File_name: disk.py
import random

class Disk():
    def __init__(self):
        pass

    def disks():
        lis = []
        for i in range(5):
            lis.append(random.randint(1,10))
        return lis

假设所有文件都保存在同一个目录中,我在尝试测试时遇到以下错误。

    assert __name__ == "__main__", "This module should NOT be imported."
AssertionError: This module should NOT be imported.

但是,如果我从 do.py 文件中删除 assert 代码,效果会很好。

你能告诉我如何测试包含 assert name == "__main__" 的文件吗?

进行了大量研究并跟踪了 100 多个 Whosebug 链接后,我找不到可以立即帮助将文件导入 UT 的解决方案。

原因

您可以模拟断言或 name,因为它尚未导入。您必须将其导入断言,这将不起作用,因为您会遇到异常。

解决方案

所以一个 hacky 方法,应该没问题,因为这是一个 UT,是对“sed -i '/assert __name__/d' path/to/file 调用 os.system ]" 在导入之前。这只会在 运行 时间从文件中删除该行 :)

例子

import os
os.system("sed -i '/assert __name__/d' /path/to/file")