[英]How to mock.patch a class imported in another module
我有一個帶有這樣一個模塊的python類:
xy.py
from a.b import ClassA
class ClassB:
def method_1():
a = ClassA()
a.method2()
然后我將 ClassA 定義為:
b.py
from c import ClassC
class ClassA:
def method2():
c = ClassC()
c.method3()
現在在這段代碼中,在為 xy.py 編寫測試時我想模擬.patch ClassC,有沒有辦法在 python 中實現它?
顯然我試過:
mock.patch('a.b.ClassA.ClassC')
和
mock.patch('a.b.c.ClassC')
這些都沒有奏效。
您需要修補ClassC
所在的位置,以便在b
ClassC
:
mock.patch('b.ClassC')
或者,換句話說, ClassC
被導入到模塊b
,因此這就是ClassC
需要修補的范圍。
patch() 通過(臨時)將名稱指向的對象更改為另一個對象。 可以有許多名稱指向任何單個對象,因此要使修補工作,您必須確保修補被測系統使用的名稱。
基本原則是在查找對象的位置打補丁,該位置不一定與定義對象的位置相同。
在您的情況下,查找位置是abClassC
因為您想修補ClassA
使用的ClassC
。
import mock
with mock.patch('a.b.ClassC') as class_c:
instance = class_c.return_value # instance returned by ClassC()
b = ClassB()
b.method1()
assert instance.method3.called == True
每次調用方法ClassA().method2()
,該方法都會將ClassC
作為全局查找,從而在ab
模塊中找到ClassC
。 您需要修補該位置:
mock.patch('a.b.ClassC')
請參閱修補位置部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.