Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更模块化和可单元测试代码的设计模式_Python_Pytest - Fatal编程技术网

Python 更模块化和可单元测试代码的设计模式

Python 更模块化和可单元测试代码的设计模式,python,pytest,Python,Pytest,我正在重构一个700多行的意大利面函数。我明白为什么有人会把它写成一个大脚本,但使用内部函数,我已经设法把它分解成更可读和更容易理解的逻辑 def cook_所有东西(a,b): c=‘大蒜’ d=无 e=‘洋葱’ f=无 坏盘子=假 烧焦的食物=假的 def_拔出盘子(): def_cook_a(): def_prep_b(): def_加热_静止(): def_taste_b_to_z(): def_cook_others(): def_clean_up(): _把盘子拔出来 如果盘子坏了:

我正在重构一个700多行的意大利面函数。我明白为什么有人会把它写成一个大脚本,但使用内部函数,我已经设法把它分解成更可读和更容易理解的逻辑

def cook_所有东西(a,b):
c=‘大蒜’
d=无
e=‘洋葱’
f=无
坏盘子=假
烧焦的食物=假的
def_拔出盘子():
def_cook_a():
def_prep_b():
def_加热_静止():
def_taste_b_to_z():
def_cook_others():
def_clean_up():
_把盘子拔出来
如果盘子坏了:
返回
_库克
如果a.味道很好:
归还
...
每个helper函数可能修改或不修改某些变量,也可能导致或不导致提前返回。使用非局部变量非常适合这种情况

现在我对重构很满意,我想写一些单元测试,这样下一个在这上面徘徊的可怜的灵魂就不必像我一样觉得他们正在解除地雷。 哦,我不能。我了解到我不能模拟和隔离内部函数,也不能为它们编写单元测试,因为它们在函数创建之前并不存在

我尝试过的一种方法是去掉内部函数,但不能使用非局部变量,必须返回非常量数量的变量,这些变量实际上并不适合这种逻辑,并且需要额外的标志来确定返回的是什么

def_cook_a(a,b):
如果没有菜肴:
返回
如果a.味道很好:
归还
返回a,b
定义烹饪所有东西():
另一种方法是定义字典或类实例,传递该对象,并在不同的函数中不断修改它

所有这些辅助函数仅在大父函数的上下文中才有意义

有没有更好的方法值得我研究


提前谢谢。

正如Bob叔叔所说:该函数中隐藏了一个类。制作内部函数方法和局部变量实例变量,并测试该类。是的:)尽管我不得不四处散布大量的self使它不吸引人。我最终做的是将助手取出,将变量定义为全局变量,并将模块专用于此函数。这门课解决了我的需要。