Python单元测试里如何进行Mock Patch

191 阅读1分钟

在写python代码单元测试的时候,难免会有一些分支不那么容易走到,需要进行一些mock。

这时候在网上一搜,都是告诉你,如何把一个class里的方法mock掉,如何给一个对象patch一个方法,但是却鲜有文章告诉你,如何把一个普通的函数mock掉。如果一个方法不在class里,那应该怎么办呢?

动手编写代码

image.png

这是一个简单的例子,在other.c里有一个函数 my_function() 调用了old(),而old调用了another.b里的young()函数,这样来模拟实际业务中比较长的调用链。

单元测试代码也很简单,就在右侧。

这时候,我们希望mock掉young()函数,让他返回一些别的内容,比如让他返回"modified value",一个直接的写法就是加上装饰器

@mock.patch("another.b.young")

因为young函数就在another.b 文件当中,现在来试一下这样写是否可行。

image.png

运行单元测试的时候会提示出错了,没有成功mock掉。

重点来了

如果想要mock一个函数,需要在它运行的位置mock,而不是在他定义的地方mock

怎么理解

image.png

这个young函数是在other.c文件里import了的,也就是说,这时候它已经属于c了,实际运行的位置是在c里了,需要调整mock.patch 的写法

@mock.patch("other.c.young")

这样运行就没有问题了

image.png