这些答案中有很多噪音; 几乎所有都是正确但过时而不整洁。mock_open是mock框架的一部分,使用起来非常简单。patch用作上下文返回用于替换已修补的对象的对象:您可以使用它来使您的测试更简单。
Python 3.x
用builtins而不是__builtin__。
from unittest.mock import patch, mock_open
with patch("builtins.open", mock_open(read_data="data")) as mock_file:
assert open("path/to/open").read() == "data"
mock_file.assert_called_with("path/to/open")
Python 2.7
mock不是一部分,unittest你应该补丁__builtin__
from mock import patch, mock_open
with patch("__builtin__.open", mock_open(read_data="data")) as mock_file:
assert open("path/to/open").read() == "data"
mock_file.assert_called_with("path/to/open")
装饰案例
如果你patch使用mock_open()'s结果作为装饰器,因为new patch's参数可能有点奇怪。
在这种情况下最好使用new_callable patch's参数,并记住每个patch不使用的额外参数将传递给new_callable函数,如patch文档中所述。
patch()接受任意关键字参数。这些将在构造时传递给Mock(或new_callable)。
例如,Python 3.x的装饰版本是:
@patch("builtins.open", new_callable=mock_open, read_data="data")
def test_patch(mock_file):
assert open("path/to/open").read() == "data"
mock_file.assert_called_with("path/to/open")
请记住,在这种情况下,patch将添加模拟对象作为测试函数的参数。