Python测试-重置所有模拟吗?

Dav*_*d A 6 python testing unit-testing mocking pytest

使用Python / PyTest进行单元测试时,如果您with patch在代码中没有补丁装饰器或块,是否可以在每个文件/模块的末尾重置所有模拟,以避免文件间测试污染?

似乎在一个Python测试文件中模拟的内容在其他文件中仍具有相同的返回值,这意味着我的模拟在测试和文件之间持久存在(当with patch不使用补丁装饰器或块时)。

除了打补丁,还有其他方法吗?不会碰巧有a之类的mock.reset_all_mocks()东西,对吗?

Dav*_*d A 7

我最终做的是使用pytest-mock库。根据自述文件:

这个插件安装了一个模拟装置,它是一个围绕优秀模拟包提供的补丁 API 的薄包装,但好处是不必担心在测试结束时撤消补丁。(加了重点。)

所以现在我可以做:mocker.patch.object(module, 'method', return_value='hi'),测试结束时补丁将被删除。with如果您在一个测试中有多个模拟,或者如果您想在测试期间更改模拟,则无需再使用此解决方案,因此该解决方案可以很好地扩展。


For*_*ver 5

猴子修补后,我会在测试结束时撤消它,以避免泄漏到其他测试或将修补限制在范围内。

def test1(monkeypatch):
    monkeypatch.setattr(...)
    assert(...)
    monkeypatch.undo()
Run Code Online (Sandbox Code Playgroud)