2015-04-28 60 views
0

有一個包,看起來像這樣:我如何修補屬性對象的方法在python

lcl 
| 
| - lcl 
     | - LCL.py 
     | - lunabuild.py 

在lunabuild模塊,有一個Lunabuild類。 Lunabuild類有一個方法Lunabuild.configure_jobs()。 的LCL類進口lunabuild:

from lcl import lunabuild 

然後,它使用它作爲一個實例懶洋洋屬性:

@property 
def luna_build(self): 
    self._luna_build = lunabuild.Lunabuild() 

的LCL類有一個main()方法在運行Lunabuild.configure_jobs()方法:

main(self) 
    try: 
    self.luna_build.configure_jobs() 
    except ValidationError: 
    ... 
    except Exception, e: 
    return_code = 2 
    self.logger_exception(e) 

我試圖修補configure_jobs到有引發錯誤side_effect,這樣我可以測試是否如預期般記錄未知的錯誤。

我一直無法弄清where to patch。它一直告訴我它不識別該屬性,或者lunabuild沒有configure_jobs屬性。

我試過一堆不同的選項。上附加一個調試運行,我可以看到test_lcl在下面的代碼是一個lcl.lunabuild.Lunabuild對象

UPDATE: 我的最新嘗試是

with patch.object('lcl.lunabuild.Lunabuild', 'configure_jobs') as mock: 
    mock.side_effect = OSError(2, 'message') 
    retcode = test_lcl.main() 
    self.assertEquals(retcode, 2) 
+0

向我們展示如何修補它以及如何導入屬性 - 後者對於確定修補位置非常重要。 – Makoto

+0

向主要添加了信息。 – qkslvrwolf

+0

感謝你的這一點,這增加了一點難題。最後一點:你說'Lunabuild'住在那個文件結構中。你在哪裏援引它?它在同一個模塊中嗎? – Makoto

回答

1

更簡單的方式來做到這一點是路徑類的定義中的configure_jobs方法的靜態參考Lunabuild。因此,使用如下代碼應該做的正是你需要

with patch('lcl.lunabuild.Lunabuild.configure_jobs', side_effect=OSError(2, 'message')) as mock: 
    retcode = test_lcl.main() 
    self.assertEquals(retcode, 2) 

如果你想補丁只是你在測試中使用的對象,你可以通過做:

with patch.object(test_lcl.luna_build, 'configure_jobs', side_effect = OSError(2, 'message')) as mock: 
    retcode = test_lcl.main() 
    self.assertEquals(retcode, 2) 

我的味道是用patch.object剛當我有沒有其他的機會:

  1. 更復雜的理解你在做什麼
  2. 要使用它,你應該更多地瞭解OB要修補正確的東西
相關問題