[英]how can I perform a functional test to verify that when a function is run, another function returns the value I need pytest
我有這個我無法更改的類我想編寫一個測試來顯示 check_len_color 函數返回所需的顏色但它不應該是單元測試應該是正常
class CheckQr:
def __init__(self):
self.color = None
self.check_out = lambda exp, callback: callback if exp else lambda: None
def check_in_db(self, qr):
raise ConnectionError
def check_len_color(self, qr):
color = {
3: 'Red',
5: 'Green',
7: 'Fuzzy Wuzzy'
}
self.color = color.get(len(qr))
return self.color
def scan_check_out_list(self, qr):
return [
self.check_out(not self.check_len_color(qr), lambda: [
self.send_error(f"Error: Wrong qr length {len(qr)}")
]
),
self.check_out(not self.check_in_db(qr), lambda: [
self.send_error("Not in DB")
]
)
]
def check_scanned_device(self, qr: str):
for func in self.scan_check_out_list(qr):
if func():
return
message = f"hallelujah {qr}"
self.can_add_device(message)
@staticmethod
def can_add_device(message: str):
return message
@staticmethod
def send_error(error: str):
return error
如何斷言該函數返回所需的顏色而不直接調用它? 我用 moker 模擬連接到數據庫。
import pytest
from scanner_handle import CheckQr
@pytest.fixture
def checkqr():
checkqr = CheckQr()
return checkqr
def test_check_color(mocker, checkqr):
color_red = 'Red'
color_green = 'Green'
color_fuzzy_wuzzy = 'seven_c'
mocker.patch(
'scanner_handle.CheckQr.check_in_db',
return_value=True
)
assert checkqr.check_scanned_device(color_red) == color_red
assert checkqr.check_scanned_device(color_green) == color_green
assert checkqr.check_scanned_device(color_fuzzy_wuzzy) == color_fuzzy_wuzzy
def test_check_color_not_exist(mocker, checkqr):
color_not_exist = 'not_exist'
mocker.patch(
'scanner_handle.CheckQr.check_in_db',
return_value=True
)
assert checkqr.check_scanned_device(color_not_exist) == True
check_scanned_device
函數從不返回值(您可以通過查看代碼並注意沒有返回值的任何return
語句來判斷),因此如果它應該返回值並且您無法修改/修復代碼,它從根本上被破壞了,寫一個針對它的測試是沒有意義的。 除非您修補該函數本身,否則無法讓您的測試驗證它是否返回一個值。
from unittest import mock
from scanner_handle import CheckQr
def test_check_color():
checkqr = CheckQr()
colors = [
'Red',
'Green',
'seven_c',
]
with mock.patch.object(
checkqr,
'check_scanned_device',
new=lambda x: x
):
for color in colors:
assert checkqr.check_scanned_device(color) == color
def test_check_color_not_exist():
checkqr = CheckQr()
with mock.patch.object(
checkqr,
'check_scanned_device'
) as check_scanned_device:
check_scanned_device.return_value = True
assert checkqr.check_scanned_device('not_exist') == True
這當然是一個實際上並沒有測試任何東西的測試。 您可以使用上面顯示的相同mock.patch.object
技術來修補check_in_db
以用於其他測試,如果代碼中有任何運行良好的東西可以編寫測試。
如果您只想為check_len_color
編寫測試,那會簡單得多,甚至不需要patch
:
from scanner_handle import CheckQr
def test_check_color():
for color, result in [
('Red', 'Red'),
('Green', 'Green'),
('seven_c', 'Fuzzy Wuzzy'),
('not_exist', None),
]:
assert CheckQr().check_len_color(color) == result
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.