我在一个项目中,我们开始重构一些庞大的代码库。立即出现的一个问题是每个文件都会导入很多其他文件。我如何以优雅的方式在我的单元测试中模拟这个而不必改变实际的代码,这样我就可以开始编写单元测试了?
作为一个例子:具有我想要测试的函数的文件,导入其他十个文件,这些文件是我们软件的一部分,而不是python核心库。
我希望能够尽可能单独运行单元测试,现在我只测试不依赖于正在导入的文件中的内容的函数。
感谢所有的答案。
我从一开始就不知道自己想做什么,但现在我想我知道了。
问题是一些导入只有在整个应用程序运行时才有可能因为一些第三方自动魔法。所以我必须在我用sys.path指出的目录中为这些模块制作一些存根
现在我可以在我的单元测试文件中导入包含我想要编写测试功能的文件,而不会抱怨缺少模块。
发布于 2018-09-19 13:11:42
如果要在导入模块的同时确保它不导入任何内容,则可以替换__import__
内置函数。
例如,使用此类:
class ImportWrapper(object):
def __init__(self, real_import):
self.real_import = real_import
def wrapper(self, wantedModules):
def inner(moduleName, *args, **kwargs):
if moduleName in wantedModules:
print "IMPORTING MODULE", moduleName
self.real_import(*args, **kwargs)
else:
print "NOT IMPORTING MODULE", moduleName
return inner
def mock_import(self, moduleName, wantedModules):
__builtins__.__import__ = self.wrapper(wantedModules)
try:
__import__(moduleName, globals(), locals(), [], -1)
finally:
__builtins__.__import__ = self.real_import
在您的测试代码中,不要写import myModule
,而是写:
wrapper = ImportWrapper(__import__)
wrapper.mock_import('myModule', [])
的第二个参数mock_import
是模块名称的列表,你不希望内部模块的导入。
此示例可以进一步修改为例如导入除期望之外的其他模块,而不是仅仅导入它,甚至可以使用您自己的某个自定义对象模拟模块对象。
发布于 2018-09-19 13:40:01
“导入很多其他文件”?导入许多其他文件,这些文件是您自定义代码库的一部分?或者导入许多属于Python发行版的其他文件?还是导入了很多其他开源项目文件?
如果您的导入不起作用,则会出现“简单”的PYTHONPAT
H问题。获取所有PYTHONPATH
可用于测试的项目目录。我们有一个相当复杂的路径,在Windows中我们像这样管理它
@set Part1=c:\blah\blah\blah
@set Part2=c:\some\other\path
@set that=g:\shared\stuff
set PYTHONPATH=%part1%;%part2%;%that%
我们将每条路径分开,以便我们(a)知道事物的来源和(b)在我们移动物体时可以管理变化。
由于按PYTHONPATH
顺序搜索,我们可以通过调整路径上的顺序来控制使用的内容。
一旦你拥有了“一切”,它就成了一个信任的问题。
或
要么
你会测试Python库吗?如果是这样,你就有很多工作要做。如果没有,那么,你应该只模拟你实际要测试的东西。
https://stackoverflow.com/questions/-100000779
复制相似问题