2015-04-23 73 views
4

我想在我的燒瓶api中的patch方法,但它似乎沒有被替換的方法調用。 app.test_client()是否在我缺少的引擎蓋下做了些什麼。單元測試行爲與補丁(燒瓶)

例如,如果我跑

@patch('k.stats.mstats') 
    def test_ps(self, mstats): 
    mstats.return_value = (1, 2, 3) 
    rv = self.app.get('/ps/') 

,我通過調試運行下面的觀點:

@app.route('/ps/', methods=['GET']) 
def ps(): 
    import pdb 
    pdb.set_trace() 
    mstats() 

和檢查mstats,我會回來就是unmocked功能。

但是,如果我從斷點處運行k.stats import mstats,那麼我找回了我正在尋找的模擬方法。

如何確保模擬方法被調用?

回答

2

這是一個相當混亂的概念,但the documentation of patch盡力解釋它。

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

基本原理是,你修補了一個物體被擡起的地方,它不一定和它被定義的地方一樣。

這就是爲什麼你能夠觀察嘲笑的對象,當你決定注入;您正在觀察修補參考,在那個時刻查找它。

這個例子可以解釋那裏發生了什麼,但我會盡力澄清。

假設mstats住在模塊stats中。您通過模塊use_stats中的from stats import mstats導入它。

你會想嘲笑它在use_stats,因爲這是它的參考地點。

@patch('use_stats.mstats') 
def test_stats(self, mstats): 
    pass 
+0

超級有用!關於您鏈接的'patch'文檔的解釋讓它點擊。瞭解你需要修補對象被查找而不是定義的地方,這就是我所得到的結果。 – wgardiner