如何对包含 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")
我想使用 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")