如何在 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。需要注意的关键是,当 mMyFile 内部和下一行手动调用时,对 same 模拟对象的引用是 return编辑。这让您可以测试 MyFile 中的假文件是如何使用的。