簡體   English   中英

如何使用帶有 Pytest 參數化副作用的補丁進行單元測試?

[英]How to unit test using patch with a side effect with Pytest parametrize?

我正在嘗試測試我的函數,該函數接受 3 個參數並且還包含另一個我試圖模擬的函數。 問題是模擬不會通過副作用循環; 我無法將要測試的第一組值(第一個參數化參數)與副作用中的第一個值“匹配”; 第二組參數化參數與副作用中的第二個值,依此類推。

我嘗試使用燈具並嘗試使用參數化,但無濟於事。

測試代碼

# I go through each set of values I want to test with a different expected output
@pytest.mark.parametrize('banner, year, month, expected', [
    ('ctr', 2019, 1, r'A\path\file.csv'),
    ('mks', 2019, 1, r'B\path\file.csv'),
    ('sc', 2019, 1, r'C\path\file.csv'),
    ('atm', 2019, 1, r'D\path\file.csv')
])
@mock.patch('import.path.to.function.path_formatting')
def test_files(mock_directory_path_banner, banner, year, month, expected):
    # the mocked function always returns 'ctr'
    mock_directory_path_banner.side_effect = ['ctr', 'mww', 'fgl', 'fgl']
    result = get_loyalty_sales_files(banner, year, month)
    assert expected == result

總共有四個測試。 第一次通過,因為參數化測試使用來自模擬 (ctr) 的正確值。 然而,其余的測試都失敗了,因為沒有為每個參數化測試調用一個新的模擬。 我希望每次循環通過一組新的參數化值時都會調用一個新的模擬,但事實並非如此。

在帶有get_loyalty_sales_files的文件中,您有這樣的內容

import path.to.function.path_formatting

不要在@patch使用它,而是使用與本地導入模塊相同的路徑,然后附加要模擬的函數:

@patch('path.to.file.with.get_loyalty_sales_files.path_formatting')

更多關於mock.patch如何工作的信息可以在 mock docs 中找到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM