mock.patch 能够捕获的 Python 关键字的命名空间是什么?
当有人想打补丁打开或打印然后mock.patch("builtins.open")
或mock.patch("mymodule.open")
可以使用,但这不起作用,例如,使用raise
.
如果我有raise somemodule.SomeException
声明,那么我可以很容易地测试是否引发了异常,但是我如何断言实际上已经调用了 raise 关键字。pytest
喜欢(在和的帮助下pytest-mock
):
def test_myfunction_calls_raise(self, mocker):
mocked = mocker.patch("mymodule.raise")
mymodule.myfunction()
mocked.assert_called_once()
编辑:我有一个很好的答案,所以 mock.patch 不适用。除此之外,除了明显的解决方案(测试结果)之外,是否还有其他有意义的技术来测试代码中是否调用了Python 关键字 ( raise
, , ...)?return
编辑 2:我想测试的实际代码(pynput 的 Listener stop() 在 Xfce 中不能正常工作,所以我必须引发异常来停止 Listener 线程):
import pynput
# ...
def stop(self):
"""Stops listener by raising an exception."""
try:
raise pynput.mouse.Listener.StopException
except pynput.mouse.Listener.StopException:
return False
编辑 3: 上面的方法使用以下两种测试方法进行了单元测试:
def test_stop_stops_listener(self, mocker):
"""StopException is raised if MagicMock has got StopException attribute."""
mocked = mocker.patch("pynput.mouse.Listener")
with pytest.raises(TypeError): # catching classes that do not inherit from BaseException is not allowed
base.BaseMouse().stop()
assert hasattr(mocked, "StopException")
def test_stop_returns_False(self, mocker):
assert base.BaseMouse().stop() is False