【问题标题】:How to unittest file containing assert __name__ == "__main__"如何对包含断言__name__ ==“__main__”的文件进行单元测试
【发布时间】:2022-01-11 14:46:22
【问题描述】:

我想使用 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__" 的文件。

【问题讨论】:

    标签: unit-testing python-unittest python-unittest.mock


    【解决方案1】:

    做了大量研究并关注了 100 多个 Stackoverflow 链接,我找不到可以立即帮助将文件导入 UT 的解决方案。

    原因

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

    解决方案

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

    示例

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 2018-11-02
      • 2015-02-28
      • 2011-08-16
      相关资源
      最近更新 更多