我正在嘗試測驗主函式中子函式的順序:
def get_data():
pass
def process_data(data):
pass
def notify_admin(action):
pass
def save_data(data):
pass
def main_func():
notify_admin('start')
data = get_data()
processed_data = process_data(data)
save_data(processed_data)
notify_admin('finish')
我正在使用pytest,到目前為止我已經想出了這個:
import pytest
from unittest.mock import patch, Mock, call
from main_func import main_func
@patch('main_func.notify_admin')
@patch('main_func.get_data')
@patch('main_func.process_data')
@patch('main_func.save_data')
def test_main_func(mock_4, mock_3, mock_2, mock_1):
execution_order = [mock_1, mock_2, mock_3, mock_4]
order_mock = Mock()
for order, mock in enumerate(execution_order):
order_mock.attach_mock(mock, f'f_{order}')
main_func()
order_mock.assert_has_calls([
call.f_1(),
call.f_2(),
call.f_3(),
call.f_4(),
call.f_1(),
])
This is an error, which I'm not sure how to resolve:
E AssertionError: Calls not found.
E Expected: [call.f_1(), call.f_2(), call.f_3(), call.f_4(), call.f_1()]
E Actual: [call.f_1('start'),
E call.f_2(),
E call.f_3(<MagicMock name='mock.f_3()' id='2049968460848'>),
E call.f_4(<MagicMock name='mock.f_2()' id='2049968489424'>),
E call.f_1('finish')]
您能否建議解決它的方法,或者以不同的方式實施它?我已經閱讀了檔案,assert_has_calls但我仍然不確定如何在這種特殊情況下使用它。
uj5u.com熱心網友回復:
如果要在沒有引數串列的情況下檢查呼叫順序,可以使用模擬的method_calls屬性,其中包含按呼叫順序排列的呼叫串列,并且只檢查它們的名稱:
...
main_func()
assert len(order_mock.method_calls) == 4
assert order_mock.method_calls[0][0] == "f_1"
assert order_mock.method_calls[1][0] == "f_2"
assert order_mock.method_calls[2][0] == "f_3"
assert order_mock.method_calls[3][0] == "f_4"
每個方法呼叫都是名稱、位置引數和關鍵字引數的元組,因此如果您只想檢查名稱,您可以使用第一個索引。
請注意,您的測驗輸出似乎與此不匹配,但這是您實際應用程式邏輯的問題。
如果您使用has_calls,則必須提供每個引數,這也是可能的。這次獲取測驗的實際結果,應該可以這樣:
...
main_func()
order_mock.assert_has_calls([
call.f_1('start'),
call.f_2(),
call.f_3(mock1),
call.f_4(mock2),
call.f_1('finish')
])
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/512505.html
下一篇:嵌套if與for回圈的速度
