我在名為 my_file.py 的檔案中有以下函式:
import logging
log = logging.getLogger(__name__)
class MyClass:
def my_func(self):
print("Entered my_func()")
print("log.error = {}".format(log.error))
log.error("Hello World")
運行時my_func(),我看到以下輸出:
Entered my_func()
log.error = <bound method ProcessAwareLogger.error of <celery.utils.log.ProcessAwareLogger object at 0x7fd52d4f0d50>>
我想撰寫一個單元測驗用例來檢查無論何時my_func()被呼叫,log.error()都使用引數呼叫"Hello World"。
所以我的測驗用例是這樣的:
import mock
from my_file import MyClass
@mock.patch("my_file.logging.error")
def test_parse_response_with_error(self, mock_log_error):
m = MyClass()
m.my_func()
mock_log_error.assert_called_once_with("Hello World")
當我運行這個測驗用例時,我得到了錯誤:AssertionError: Expected to be called once. Called 0 times.所以我的補丁顯然沒有作業。我指定的路徑my_file.logging.error錯誤嗎?我怎樣才能使它正常作業,以便單元測驗用例通過?
uj5u.com熱心網友回復:
你嘲笑錯了。log.error創建一個與 不同的系結方法logging.error,并且該方法已經參考了logging.error在創建補丁之前保存的“真實”。
相反,直接模擬實體的error屬性。Logger
@mock.patch.object(my_file.log, 'error'):
def test_it(self, mock_log_error):
m = MyClass()
m.my_func()
mock_log_error.assert_called_once_with("Hello World")
(在匯入logging.error 之前進行修補my_file可能會起作用。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/444432.html
上一篇:Python子串列洗掉方法
