2015-08-15 82 views
4

我的代碼模擬補丁的組織結構如下:與__init__.py

DIR/A.py:

from X import Y 

class A: 
    ... 

DIR/__ init__.py:

from .A import A 
__all__ = ['A'] 

測試/ test_A。 py:

class test_A: 
    @patch("dir.A.Y") 
    def test(self, mock_Y): 
     .... 

在運行tests/test_A.py時,我(as預期)出現錯誤:

AttributeError: <class 'dir.A.A'> does not have the attribute 'Y' 

的問題是,@patch("dir.A.y")試圖找到Ydir.A.A類,而不是模塊dir.A(它是實際存在)英寸

這很明顯是因爲我的__init__.py。我可以通過將模塊名稱A和類名稱A更改爲不同的符號來解決此問題。

代碼的組織方式,我想避免這樣的命名更改。我怎樣才能以Y的方式在正確的地方使用patch

回答

6

可以使用patch.object()裝飾器,並從sys.modules檢索模塊:

@patch.object(sys.modules['dir.A'], 'Y') 
def test(self, mock_Y): 
    ... 
+0

基本上我說的,而是更早。 :-) –

+0

@MartijnPieters:這個問題基本上有一個答案。 :) –