unit-test
如果你曾經用過unittest.mock.patch,不知道在使用時你有沒有一個疑問:
我這個patch用下去,究竟要patch哪裡?
我是誰,我在哪裡
如果今天我們的資料夾結構長這樣
在connection.py內,是一個簡單的request
然後今天在測試的時候,如果是使用mock.patch不久的人,應該會有個顯著的疑惑
在寫到第11行的時候,到底patch要指到哪裡才是對的呢?
究竟是patch
究竟該patch誰才是對的?
如果在這個地方放棄思考,用try&error的方式硬幹當然是可以的,但沒有搞懂這裡的邏輯的話不說可惜,之後照寫的測試可能會怪怪的(汗
在揭曉答案之前,有個基本的東西需要知道
在各位import module的時候,有沒有想過import到底做了什麼呢?
例如一個簡單的範例,我們在A.py裡import
這時python會把requests的名子抓過來,放到這個A.py的namespace裡
這時候如果在這個A.py內呼叫
就會看到
requests現在就會被A.py看到了
patch究竟做了什麼事情呢?
實際上的運作是,patch會把namespace內的某個指到的module換成的MagicMock object,所以要讓patch正確做事,我們必須
我們以前列的connection.py為例子
這時候如果在這裡dir(),如同上個章節所言,我們會得到
所以,如果在測試中要patch掉這裡的requests,以patch的定義來說,我們必須
patch("app.connection.requests")
最後,不管用得是patch還是patch.object,他們的souce code其實最後都一樣,所以如果用的是patch.object的注意事項也一樣
有興趣的可以去這裡 https://github.com/python/cpython/blob/main/Lib/unittest/mock.py#L1317
https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch
本篇是遠遠不到講完,甚至可能連講清楚都欠奉的一篇文章,所以理所當然的有下集(其實是寫不完)
下一篇文繼續深入講解這個主題
令人混淆的mock.patch,他還是高人氣的秘密在哪裡呢?
主要會講講where to patch跟一些案例