2015-06-19 58 views
4

我有一個Python類這樣的模塊的進口的類:如何mock.patch在另一個模塊

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編寫測試時,我想mock.patch ClassC,有沒有辦法在python中實現呢?

很明顯,我試過:

mock.patch('a.b.ClassA.ClassC) 

mock.patch('a.b.c.ClassC') 

這些工作無。

回答

7

你需要修補的ClassC位於所以這是在bClassC

mock.patch('b.ClassC') 

或者,換句話說,ClassC被導入模塊b,因此這是在打補丁ClassC需求的範圍。

+0

儘管已經導入了'b'。 – chepner

+1

@chepner:模擬將進行導入。 –

+0

謝謝它的作品! – Ankit

1

每次調用方法ClassA().method2()時,該方法都會查找ClassC作爲全局,因此在a.b模塊中找到ClassC。你需要修補位置:

mock.patch('a.b.ClassC') 

Where to patch section部分。

3

Where to patch

補丁()的工作方式(暫時)改變對象的名稱指向與另一之一。可以有許多名稱指向任何單個對象,因此爲了修補工作,您必須確保您修補被測系統使用的名稱。

的基本原則是,你修補的對象是擡頭,這是不一定相同的地方,在它被定義

在你的情況,因爲要修補的ClassA使用ClassC查找位置a.b.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 
+0

請不要只是轉儲代碼,解釋*爲什麼*這是一個答案。 –

相關問題