py3相對import和mock的問題之二

2022-08-12 11:45:14 字數 2498 閱讀 6684

本文主要用於記錄問題,很難解決您的實際問題,見諒!

測試用例結構:

簡單介紹一下,a檔案是非py服務(用了一些莫名其妙的模組),b依賴於a,因此我在測試b中的**需要將a進行隔離。

在core**中用裝飾器的方式,將a模組隔離(from . import a這種寫法,在sys.modules中就是test.a的形式),然後重寫a.afunc的**。

好,看**邏輯,貌似沒什麼問題。

結果:

我把整個a模組都mock了,怎麼還會匯入a裡面的模組?

寫乙個空的測試類,看看有沒有mock

結果:成功mock進去了……

問題猜測:估計是我神奇的寫法有問題。

沒錯!如果直接mock那個神奇的模組的話,一點問題沒有,但是如果確實有這麼乙個模組,用到了很多其他py命令列無法呼叫的模組的話,還是這種寫法更好一點。

這種寫法的原理是在sys.modules中加入mock例項,使得和原來的模組隔離的。

而python的import有個問題:

from a import  b。用這個寫法的話,會先初始化模組a,然後在a模組中初始化模組b。

測試**:

from test import

dimport

sysimport

test

print

(sys.modules)

print(dir(test))

結果:

如圖,發生問題的邏輯是:from import的時候,系統環境有對應路徑,再import test的時候,會對其中的d進行初始化,導致d裡面的東西也會跟著初始化。

所以發生了上面這一幕,我明明把d都給mock了,但是d裡面的import還是被執行了。

對於這種方式,解決方法就是不用from import 或者 直接mock那個奇怪的模組。

主要還是這種寫法的問題

還是直接mock不用的模組比較好,這方面需要注意寫法。

這篇文章在我眼裡是不合格的文章,因為博主也看不懂,而且各種問題也沒表述清楚……就當做是問題記錄吧

py2和py3之間的區別

1.編碼 py2採用的是ascll編碼 py3採用unicode編碼 2.print py2中print是乙個關鍵字 py3中print是乙個函式,含有括號 3.input py2中raw input 這個函式返回乙個字串,但不會對輸入的字串進行計算 比如將它轉化成int或者float input ...

py2和py3之間的不同

很瑣碎,而print語法的變化可能是最廣為人知的了,但是仍值得一提的是 python 2 的 print 宣告已經被print 函式取代了,這意味著我們必須包裝我們想列印在小括號中的物件。python 2 不具有額外的小括號問題。但對比一下,如果我們按照 python 2 的方式不使用小括號呼叫pr...

數學思想3 相對

相對有點象哲學中的矛盾。0是最簡單的數,加法是最簡單的運算,如果光有這些,你得到的永遠是0,不能產生新數,也不能解決任何問題。於是引進了數字1,這稍微麻煩一些,把它自加,會得到乙個新數2,更麻煩,不斷自加,就不斷產生 新數,越來越麻煩。但這能表示更多東西,也就是更有用。為了使幾個相同數的連加變得簡單...