[英]Pytest works with old mock, but not unittest.mock
我正在將一些代碼從Python 2移植到3,並且py.test
與unittest.mock
的patch
裝飾器不能很好地兼容。 當我使用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.