我需要模擬一個函式 (funk) 呼叫,該呼叫依賴于在此函式 (funk) 中呼叫的其他兩個函式的回傳值。是否可以使用 1 個以上的 Patch 來模擬兩個被呼叫函式的回傳值。
要測驗/模擬的 API:
from subprocess import check_output
def get_value_a(value_a: int):
return value_a
def get_value_b(value_b: int):
return value_b
def print_contents_of_cwd(val_a, val_b):
if val_a > 0:
return check_output(['ls']).split()
else:
return val_b
我正在嘗試使用兩個補丁來模擬兩個函式 (get_value_a和get_value_b)的回傳值,如下所示:
from Mack_Test_Practise import list_dir
from unittest import mock, TestCase
class TestExamples(TestCase):
# Using Decorator Method
@mock.patch('Mack_Test_Practise.list_dir.check_output',
return_value=b'list_dir.py')
@mock.patch('Mack_Test_Practise.list_dir.get_value_a',
return_value=5)
@mock.patch('Mack_Test_Practise.list_dir.get_value_b',
return_value=3)
def test_print_contents_of_file(self, mock_check_output,val_a, val_b):
actual_result = list_dir.print_contents_of_cwd(val_a, val_b)
print("actual_result", actual_result)
expected_result = b'list_dir.py'
self.assertIn(expected_result, actual_result)
當我運行測驗時,拋出以下錯誤。
Error
Traceback (most recent call last):
File "/usr/lib/python3.6/unittest/mock.py", line 1183, in patched
return func(*args, **keywargs)
File
"/home/shyam/PycharmProjects/pythonProject/Mock_Test/test_list_dir.py", line 15, in test_print_contents_of_file
actual_result = list_dir.print_contents_of_cwd(val_a, val_b)
File "/home/shyam/PycharmProjects/pythonProject/Mack_Test_Practise/list_dir.py", line 13, in print_contents_of_cwd
if val_a > 0:
**TypeError: '>' not supported between instances of 'MagicMock' and 'int'**
我的第一個問題是,是否允許像我一樣使用多個補丁?
我的第二個問題是為什么我們會得到型別錯誤,因為它是 Python 中的合法運算子。
請提出解決方案。
感謝一百萬和最好的問候!!
uj5u.com熱心網友回復:
像這樣使用多個補丁是合法的。
我認為您的問題是因為您修補了一個函式,并試圖將修補后的函式與整數進行比較。您在模擬中設定了回傳值,但您仍然需要呼叫它來獲取該回傳值。
actual_result = list_dir.print_contents_of_cwd(val_a(), val_b())
請注意val_a()和val_b()
現在,由于這些不再是值,而是函式(從技術上講,它們是 MagicMock 物件,但它們正在替換函式)我建議將它們重命名為get_val_a()andget_val_b()以便您的意圖更加清晰。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/361625.html
上一篇:最近程式的Python總和
