如何在 Python 中使用模拟?
How to use mocks in Python?
我知道 Python 中有关于模拟的教程和其他帖子,但我是测试和模拟的新手,我阅读了一些帖子并观看了教程,但它们让我更加困惑。我有两个刚刚写得很快的例子,我想知道如何使用模拟来测试两个例子。
在第一个示例中测试返回的值,在第二个示例中测试如果我们创建 'MyFile' class.[=13= 的新实例则创建文件]
1:
def get_link_tags(url):
response = requests.get(url)
pattern = re.compile("<link.*>")
found_link_tags = pattern.findall(response.text)
return found_link_tags
2:
class MyFile:
def __init__(self, filename, content):
self.content = content
with open(filename, "w") as fl:
fl.write(content)
谢谢
在第一个例子中,你想模拟 requests.get
以便你可以控制它的 return 值。由于 requests.get
实际上是一个 Mock 对象
当您调用 get_link_tags
时,它的 return 值也将是,因此您可以将其 text
属性配置为您想要的任何数据。
with mock.patch('requests.get') as mock_get:
mock_get.return_value.text = "my test data"
rv = get_link_tags("http://example.com")
第二个例子有点诡异; mock
库提供了一个使其更简单的函数。
m = mock.mock_open()
with mock.patch('__main__.open', m):
f = MyFile('foo.txt', 'data')
h = m()
h.write.assert_called_once_with('data')
m
是一个模拟对象,它在 with
语句的正文中的任何地方替换 open
。需要注意的关键是,当 m
在 MyFile
内部和下一行手动调用时,对 same 模拟对象的引用是 return编辑。这让您可以测试 MyFile
中的假文件是如何使用的。
我知道 Python 中有关于模拟的教程和其他帖子,但我是测试和模拟的新手,我阅读了一些帖子并观看了教程,但它们让我更加困惑。我有两个刚刚写得很快的例子,我想知道如何使用模拟来测试两个例子。
在第一个示例中测试返回的值,在第二个示例中测试如果我们创建 'MyFile' class.[=13= 的新实例则创建文件]
1:
def get_link_tags(url):
response = requests.get(url)
pattern = re.compile("<link.*>")
found_link_tags = pattern.findall(response.text)
return found_link_tags
2:
class MyFile:
def __init__(self, filename, content):
self.content = content
with open(filename, "w") as fl:
fl.write(content)
谢谢
在第一个例子中,你想模拟 requests.get
以便你可以控制它的 return 值。由于 requests.get
实际上是一个 Mock 对象
当您调用 get_link_tags
时,它的 return 值也将是,因此您可以将其 text
属性配置为您想要的任何数据。
with mock.patch('requests.get') as mock_get:
mock_get.return_value.text = "my test data"
rv = get_link_tags("http://example.com")
第二个例子有点诡异; mock
库提供了一个使其更简单的函数。
m = mock.mock_open()
with mock.patch('__main__.open', m):
f = MyFile('foo.txt', 'data')
h = m()
h.write.assert_called_once_with('data')
m
是一个模拟对象,它在 with
语句的正文中的任何地方替换 open
。需要注意的关键是,当 m
在 MyFile
内部和下一行手动调用时,对 same 模拟对象的引用是 return编辑。这让您可以测试 MyFile
中的假文件是如何使用的。