如何在Python中使用mock?
我知道有关于Python中模拟的教程和其他帖子,但我对测试和模拟还不熟悉,我读了一些帖子并观看了一个教程,但它们更让我困惑。我有两个例子,我刚刚写得很快,我想知道如何使用mock来测试两个例子 在第一个示例中,测试返回的值,在第二个示例中,测试如果我们创建“MyFile”类的新实例,将创建一个文件 1:如何在Python中使用mock?,python,unit-testing,mocking,python-unittest,Python,Unit Testing,Mocking,Python Unittest,我知道有关于Python中模拟的教程和其他帖子,但我对测试和模拟还不熟悉,我读了一些帖子并观看了一个教程,但它们更让我困惑。我有两个例子,我刚刚写得很快,我想知道如何使用mock来测试两个例子 在第一个示例中,测试返回的值,在第二个示例中,测试如果我们创建“MyFile”类的新实例,将创建一个文件 1: 谢谢在第一个示例中,您希望模拟请求。获取,以便控制其返回值。因为请求.get实际上是一个模拟对象 调用get\u link\u tags时,其返回值也将为,因此您可以将其text属性配置为所需的
谢谢在第一个示例中,您希望模拟
请求。获取
,以便控制其返回值。因为请求.get
实际上是一个模拟对象
调用get\u link\u tags
时,其返回值也将为,因此您可以将其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
是一个模拟对象,它用语句替换主体中的所有open
。需要注意的关键是,当在MyFile
内部和在下一行中手动调用m
时,将返回对同一模拟对象的引用。这使您可以测试如何使用MyFile
中的伪文件。在第一个示例中,您希望模拟请求。获取
,以便控制其返回值。因为请求.get
实际上是一个模拟对象
调用get\u link\u tags
时,其返回值也将为,因此您可以将其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
是一个模拟对象,它用
语句替换主体中的所有open
。需要注意的关键是,当在MyFile
内部和在下一行中手动调用m
时,将返回对同一模拟对象的引用。这可以让您测试如何使用MyFile
中的假文件。因为响应中没有任何
标记。text
(现在是字符串“我的测试数据”
)获取链接标签将返回空列表。self.assertEqual(rv,[])
是否适合完成测试,或者是否应该调用任何mock
assert方法?在这种情况下,self.assertEqual
是可以的,因为您关心的不是mock的实际行为,而是get\u link\u标记
对mock返回的数据的处理。理想情况下,您将有多个测试,每个测试都将mock\u get.return\u value.text
设置为不同的值,以确认get\u link\u标记对每个测试都做了正确的操作。例如,您可以对mock对象做一件事,验证是否使用传递给获取链接\u标记的参数调用了它。非常感谢您的帮助。由于响应中没有任何
标记。text
(现在是字符串“我的测试数据”
)获取链接\u标记将返回空列表。self.assertEqual(rv,[])
是否适合完成测试,或者是否应该调用任何mock
assert方法?在这种情况下,self.assertEqual
是可以的,因为您关心的不是mock的实际行为,而是get\u link\u标记
对mock返回的数据的处理。理想情况下,您将有多个测试,每个测试都将mock\u get.return\u value.text
设置为不同的值,以确认get\u link\u标记对每个测试都做了正确的操作。例如,您可以对mock对象做一件事,验证是否使用传递给get\u link\u tags
的参数调用它。非常感谢您的帮助。