簡體   English   中英

Pytest適用於舊的mock,但不適用於unittest.mock

[英]Pytest works with old mock, but not unittest.mock

我正在將一些代碼從Python 2移植到3,並且py.testunittest.mockpatch裝飾器不能很好地兼容。 當我使用patch裝飾器將模擬傳遞給測試函數的參數時, py.test將該參數解釋為fixture,並且無法設置測試。

這是一個人為的例子,希望能夠解決這個問題:

@patch('my_module.my_func')
def test_my_func(mock_func):
    mock_func()
    mock_func.assert_called_once_with()

運行py.test ,錯誤消息如下所示:

E       fixture 'my_func' not found
>       available fixtures: cache, capfd, capsys, doctest_namespace, monkeypatch, pytestconfig, record_xml_property, recwarn, tmpdir, tmpdir_factory
>       use 'pytest --fixtures [testpath]' for help on them.

這是發生此故障的唯一方案。 如果我顯式調用測試(即運行test_my_func() ),沒有錯誤。 如果我使用其他任何修補技術修補my_func ,則沒有錯誤。 如果我從mock而不是unittest.mock導入補丁,沒有錯誤。

它只是在使用py.test運行我的測試時,使用unittest.mock ,並在發生這種情況時使用裝飾器進行修補。

我正在運行Python 3.4.5。

是的,不支持模擬裝飾器。 它並不是那么糟糕 - 裝飾設備改變功能簽名被認為是個壞主意。 但是你仍然可以使用with mock.patch(...)語法。

另外作為一個選項,有一個pytest-mock插件,非常干凈的api用於模擬

def test_foo(mocker):
    # all valid calls
    mocker.patch('os.remove')
    mocker.patch.object(os, 'listdir', autospec=True)
    mocked_isfile = mocker.patch('os.path.isfile')

有一個pytest問題現在似乎在較新版本的pytest得到解決: https//github.com/pytest-dev/pytest/pull/3206/commits/b6166dccb4d2b48173aa7e7739be52db9d2d56a0

基本上,如果你安裝了mock ,這將失敗。 您可以通過卸載mock並再次運行測試來驗證。

如果你真的需要那個版本的pytest,你可以在函數內部使用with patch(..)進行模擬。

暫無
暫無

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

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