在写python代码单元测试的时候,难免会有一些分支不那么容易走到,需要进行一些mock。
这时候在网上一搜,都是告诉你,如何把一个class里的方法mock掉,如何给一个对象patch一个方法,但是却鲜有文章告诉你,如何把一个普通的函数mock掉。如果一个方法不在class里,那应该怎么办呢?
动手编写代码
这是一个简单的例子,在other.c里有一个函数 my_function() 调用了old(),而old调用了another.b里的young()函数,这样来模拟实际业务中比较长的调用链。
单元测试代码也很简单,就在右侧。
这时候,我们希望mock掉young()函数,让他返回一些别的内容,比如让他返回"modified value",一个直接的写法就是加上装饰器
@mock.patch("another.b.young")
因为young函数就在another.b 文件当中,现在来试一下这样写是否可行。
运行单元测试的时候会提示出错了,没有成功mock掉。
重点来了
如果想要mock一个函数,需要在它运行的位置mock,而不是在他定义的地方mock
怎么理解
这个young函数是在other.c文件里import了的,也就是说,这时候它已经属于c了,实际运行的位置是在c里了,需要调整mock.patch 的写法
@mock.patch("other.c.young")
这样运行就没有问题了